有没有一种方法可以从另一个迭代器构造一个迭代器,该迭代器总是前进(在
std::advance
的意义上)一个数字n
?我想将迭代器传递给 std::transform
但转换应该只发生在每个 n
个元素上。这些东西需要我自己写吗? (std::execution::par_unseq
应该还是可以的)。
是的,有一种方法可以构造一个迭代器,它总是前进一个数字n,但你需要自己编写它,这是一些乏味的工作。
但是,通过跟踪计数器变量并在我们用于 std::transform 的 lambda 表达式中使用 capture 子句,您可以转换每个第 n 个元素,而无需创建前进数字 n 的迭代器。
这是一个基本的工作示例,它对数组的每第三个数字进行平方
#include <iostream>
#include <algorithm>
#include <array>
int main()
{
std::array<int, 10> first{1,2,3,4,5,6,7,8,9,10};
std::array<int, 10> second;
int counter = 1, n = 3;
std::transform(first.begin(), first.end(), second.begin(),
[&counter, n] (int x) mutable {
if (counter++ % n == 0) return x*x;
else return x;
}
);
for (const int& i : second)
{
std::cout << i << " ";
}
std::cout << "\n";
return 0;
}
输出:
1 2 9 4 5 36 7 8 81 10
我们使用了可变的 lambda,以便我们可以更新计数器变量。