函子和迭代槽向量

Functors and iteration trough vector

本文关键字:向量 迭代      更新时间:2023-10-16

我正在尝试进入"现代"C++,所以我正在尝试学习如何正确使用函子,以及随后的lambda。我想我已经理解了它背后的基本原理,但我很难理解如何从传递给我的算法的向量中获取任何元素。所以,假设我希望创建一个长度为 N 的斐波那契数列......

struct Adder {
    int operator()(int a, int b) {return a+b;}
};
const int N = 10;
int main() {
    std::vector<int> vec = {0, 1};
    vec.resize(N);
    //Old Way
    for(int i = 2; i < vec.size(); i++) {
        vec[i] = vec[i-1] + vec[i-2];
    }
    std::transform(vec.begin(), vec.end(), vec.begin(), [](int i){return i*3;});    //single operator given to function, works
//    std::transform(vec.begin()+2, vec.end(), vec.begin(), /*here two calls are needed , for a and b operators*/);
    return 0;
}

基本上我的问题是如何激活struct Adder中定义的函子?将两个操作员传递给他的正确方法是什么?

Adder::operator()应该const . 而且您的Adder函子是不必要的。 只需使用std::plus<>.

从 C++17 开始,我们有接受两个序列的transform重载。 所以我们可以做:(如果你愿意,你可以用Adder{}代替std::plus<>{}(

std::transform(vec.begin(), vec.end() - 2, vec.begin() + 1, vec.begin() + 2, std::plus<>{});

最小示例:(现场演示(

#include <algorithm>
#include <iostream>
#include <vector>
constexpr int N = 10;
int main()
{
    std::vector<int> vec{0, 1};
    vec.resize(N);
    std::transform(vec.begin(), vec.end() - 2, vec.begin() + 1, vec.begin() + 2, std::plus<>{});
    for (int x : vec)
        std::cout << x << " ";
    std::cout << "n";
}