如何使用 STL 在 C 中复制 map、filter 和 reduce 行为?

新手上路,请多包涵

我想我们可以使用 std::transform 在 C++ 中复制地图行为,如下所示:

 std::vector<int> in = { 1 , 2 , 3 ,4 };
std::vector<int> out(in.size());

std::transform(in.being() , in.end() , out.begin() , [](const int & val)
{
    return val+1;
});

我想更好的方法是使用后插入器。

 std::vector<int> out2;

std::transform(in.begin() , in.end() , std::back_inserter(out2) , [](const int & val){
      return val + 1;
});

// out will be { 2 , 3 ,4 ,5 }

我对吗 ?如何使用 STL 在 C++ 中进行过滤和减少操作?

原文由 nnrales 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 795
1 个回答

您可以使用 std::transform 进行映射,使用 std::copy_if 进行过滤。

根据您的输入以及是否要使用特定类型的执行模型,您有两个减少选项。我在下面编写了一些简单的示例来演示常见的用例。请注意,您应该根据需要使用所有这些算法的多个重载。


  1. std::transform

对整数向量进行平方:

 std::vector<int> nums{1,2,3,4};
auto unary_op = [](int num) {return std::pow(num, 2);};
std::transform(nums.begin(), nums.end(), nums.begin(), unary_op);
// nums: 1, 4, 9, 16

  1. std::copy_if

仅从整数向量中过滤奇数:

 std::vector<int> nums{1,2,3,4};
std::vector<int> odd_nums;
auto pred = [](int num) {return num & 1;};
std::copy_if(nums.begin(), nums.end(), std::back_inserter(odd_nums), pred);
// odd_nums: 1, 3

  1. std::reduce

使用并行执行模型从 0 开始的向量中的整数之和。例如,如果您正在对一个非常大的列表执行 reduce 操作,这将非常有用。估计这种情况下的二元运算符(“+”)是关联和可交换的,否则行为将是不确定的。这真的很重要。如果执行模型不是顺序的,reduce 操作是无序的。仅从 C++17 开始可用。

 std::vector<int> nums{1,2,3,4};
auto binary_op = [](int num1, int num2){return num1 + num2;};
int result = std::reduce(std::execution::par, nums.begin(), nums.end(), 0, binary_op);
// result: 10

  1. std::accumulate

与reduce相同,只是它不支持执行模型并且reduce操作是按顺序完成的。

 std::vector<int> nums{1,2,3,4};
auto binary_op = [](int num1, int num2){return num1 + num2;};
int result = std::accumulate(nums.begin(), nums.end(), 0, binary_op);
// result: 10

原文由 happy_sisyphus 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题