您可以使用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 开始的整数求和。例如,如果您要对一个非常大的列表执行归约操作,这非常有用。认为本例中的二元运算符(“+”)是关联且可交换的,否则行为将是不确定的。这真的很重要。如果执行模型不是顺序的,则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
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