如何使用STL复制地图,过滤和减少C 的行为
How to replicate map, filter and reduce behaviors in C++ using 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<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 的操作?
您可以使用std::transform
进行映射,而std::copy_if
进行过滤。
您有两个选择,具体取决于您的输入以及要使用特定类型的执行模型。我在下面写了一些简单的示例,以证明常见用例。请注意,所有这些算法有多个过载,您应该根据自己的需求使用。
-
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::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
-
std::reduce
使用并行执行模型从0开始,矢量中的整数总和。例如,如果您在一个非常大的列表上进行减少操作,这确实很有用。认为在这种情况下的二进制运算符(" ")是相关的,否则该行为将是非确定性的。这真的很重要。如果执行模型不是顺序的,则降低操作是零下的。仅自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
-
std::accumulate
与降低相同,除了它不支持执行模型,并且降低操作是按顺序完成的。
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
取决于您使用的容器。
std::back_inserter
仅在容器具有push_back
函数时才能工作。
例如,back_insterter
不能与forward_list
一起使用。
在这种情况下,我们需要在以相同和第一种方法为std::transform
之前分配内存。
我从Happy_sisyphus的答案中概括了transform
示例:
#include <algorithm>
// avoid calling this function 'map', it will clash with 'using std::map;'
template<typename I, typename F>
void apply_to_all(I& iterable, const F& functor)
{
std::transform(iterable.begin(), iterable.end(), iterable.begin(), functor);
}
示例使用:
std::vector<int> nums{1,2,3,4};
auto unary_op = [](int num) {return std::pow(num, 2);};
apply_to_all(nums, unary_op);
// nums: 1, 4, 9, 16
相关文章:
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 在C应用程序中运行C++(带有STL)函数
- 使用2个键的cpp-stl::优先级队列排序不正确
- 在STL容器中使用模板类
- 用C++中的CPerson(类)类型的对象初始化STL矢量
- 将stl字符串缩小到小于15个字符的容量
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 检查函数返回类型是否与STL容器类型值相同
- STL算法函数在多个一维容器上的使用
- 在STL - C++中按成绩对学生列表进行排序?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- λ可以适应STL吗?
- 为什么使用 NDK 不能存在不同的 stl 实现?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- 如何使用STL复制地图,过滤和减少C 的行为
- 如何使用STL算法过滤数组?
- 现代过滤STL容器的方法
- 是否可以使用比较器函数过滤掉STL多集下界检查的数据