如何在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
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