将 std::transform 应用于每个第 n 个元素

问题描述 投票:0回答:1

有没有一种方法可以从另一个迭代器构造一个迭代器,该迭代器总是前进(在

std::advance
的意义上)一个数字
n
?我想将迭代器传递给
std::transform
但转换应该只发生在每个
n
个元素上。这些东西需要我自己写吗? (
std::execution::par_unseq
应该还是可以的)。

c++ stl iterator c++20
1个回答
0
投票

是的,有一种方法可以构造一个迭代器,它总是前进一个数字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,以便我们可以更新计数器变量。

© www.soinside.com 2019 - 2024. All rights reserved.