如何在C+中复制映射、过滤和减少行为+;使用STL? 我想我们可以使用STD::转换来复制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 in={1,2,3,4}; std::vector out(in.size()); std::transform(in.being()、in.end()、out.begin()、[](常量int&val) { 返回val+1; });

如何在C+中复制映射、过滤和减少行为+;使用STL? 我想我们可以使用STD::转换来复制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 in={1,2,3,4}; std::vector out(in.size()); std::transform(in.being()、in.end()、out.begin()、[](常量int&val) { 返回val+1; });,c++,c++11,stl,functional-programming,C++,C++11,Stl,Functional Programming,我想更好的办法是使用背部插入器 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 } std::vector out2; std::transform(in.begin()、in.end()、s

我想更好的办法是使用背部插入器

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 }
std::vector out2;
std::transform(in.begin()、in.end()、std::back_插入器(out2),[](常量int&val){
返回val+1;
});
//输出将是{2,3,4,5}

我说得对吗?如何使用STL在C++中进行筛选和减少操作?

取决于您使用的容器。

std::back\u inserter
仅当容器具有
push\u back
功能时才起作用

例如,
back\u inster
不能与
forward\u list
一起使用


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

您可以使用
std::transform
进行映射,如果
std::copy_
进行过滤

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


  • 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
    
  • 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
    

    定义“更好的方式”对你意味着什么。请记住,如果你问两个C++黑客什么是“更好的方法”来做X,你会得到三个不同的答案。“filter”可能对应于<>代码:STD::CopyIOI:< /C>和/或<代码> STD::我不知道“减少”应该做什么。@SamVarshavchik哈哈。你觉得什么更好?有第三条路吗?这些问题对我来说非常有趣。@IgorTandetnik:reduce/fold在C++
    transform
    copy\u if
    acculate
    中被称为
    std::acculate
    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
    
    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