c++ - 仿函数和迭代槽 vector

标签 c++ lambda functor

我正在尝试进入“现代”C++,因此我正在尝试学习如何正确使用仿函数,以及随后的 lambda。 我想我已经理解了它背后的基本原理,但是我很难理解如何从传递给我的算法的 vector 中获取任何元素。 因此,假设我希望创建一个长度为 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<>{});

最小示例:( 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";
}

关于c++ - 仿函数和迭代槽 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57049124/

相关文章:

c++ - 我可以将 map 迭代器与 OpenMP 并行使用吗?

c++ - 如何从 session ID 中查找用户名?

c# - 如何使用 Func<> 更新对象属性?

java - Lambda 性能改进,Java 8 对比 11

c++ - 如何存储多态闭包?

c# - 如何在 C# 中表达仿函数?

c++ - 仿函数:将 std::function 包装在类中

c++ - 在类a声明之前从类a继承类b

c++ - 删除字符串中的空格

c++ - 在转换中使用仿函数(带/不带构造函数)