什么是C等价的python的map()

时间:2013-11-11 13:07:37

标签: python c map

情况如下:

输入由空格分隔的整数/浮点数/双精度数据类型组成。数据类型将是相同的。输入的长度在运行时决定。输入显示如下(每行单个测试用例)

1 5 7 9
2 32 5 5 6
2 5 7 43 73 364
1 2 

在使用map函数的python中,返回具有所需数据类型的输入列表。我需要使用C实现相同的功能。这是我到目前为止所尝试的内容:

  1. 使用fgets并解析输入,但失败的可能性太大和/或很慢
  2. 使用strtol()strok()等功能,但它们仅在输入大小已知时才有效。
  3. 有关如何进行的任何建议吗?

    PS:已知最大输入数,输入数始终低于此任意大的值,但其数量可能会有所不同。

1 个答案:

答案 0 :(得分:7)

您的问题包含很多谈论与map()无关的事情。你应该尽量避免这种情况,并且要更加专注。如果你想知道几件事情,把它们分成他们自己的问题,不要只是喋喋不休地讨论整个问题。

在C中,没有办法编写一般的“应用此函数”代码,而没有先创建一种描述所涉及的所有数据的方法,那么它就有可能。

如果数据是整数,则需要这样的内容:

int * map_int(const int *input, size_t input_len, int (*func)(int x));

上面应该返回一个与输入大小相同的动态分配数组,其中每个元素都是在相应的输入元素上运行func()的结果。这可能与你需要来的通用map()接近,在这里。

这可以通过以下方式轻松实现:

int * map_int(const int *input, size_t input_len, int (*func)(int x))
{
  int *out = malloc(input_len * sizeof *out);
  if(out != NULL)
  {
    for(size_t i = 0; i < input_len; ++i)
      out[i] = func(input[i]); 
  }
  return out;
}

请注意,上述内容将假定func有效;更合理的通用函数应该将NULL函数指针视为标识映射。另请注意,它执行堆分配并将所有权移至调用方。更合理的实现也许应该支持调用者拥有的缓冲区。