函子和迭代槽向量

时间:2019-07-16 01:57:59

标签: c++ lambda functor

我正在尝试使用“现代” 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中定义的函子?将两个操作员交给他的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

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<>{});

最小示例:(live demo

#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";
}