如何使用STL复制map,过滤和减少C ++中的行为?

时间:2016-12-01 02:24:07

标签: c++ c++11 stl functional-programming

我想我们可以使用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;
});

我想更好的方法是使用后插页器。&#39;

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 ++中的操作?

2 个答案:

答案 0 :(得分: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操作将是乱序的。仅自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::reduce(std::execution::par, nums.begin(), nums.end(), 0, binary_op);
// result: 10

答案 1 :(得分:0)

取决于您使用的容器。

std::back_inserter仅在容器具有push_back功能时才有效。

例如,back_insterter不能与forward_list一起使用。

在这种情况下,我们需要在调用std::transform之前分配内存,并且第一种方法更好。