函子和迭代槽向量
Functors and iteration trough vector
我正在尝试学习 'modern' 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<>{});
最小示例:(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";
}
我正在尝试学习 'modern' 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<>{});
最小示例:(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";
}