【发布时间】:2013-06-27 06:18:02
【问题描述】:
我有一个结构向量 - 说结构类似于:
struct foo {
int bar1;
int bar2;
}
现在我想更新向量的每个元素,更新是 bar1 乘以 2。
执行此操作的简单方法是遍历向量的每个元素,但是否有更好的方法来执行此操作,例如使用带有 c++11 lambda 函数的库函数?
【问题讨论】:
标签: c++ c++11 vector stl lambda
我有一个结构向量 - 说结构类似于:
struct foo {
int bar1;
int bar2;
}
现在我想更新向量的每个元素,更新是 bar1 乘以 2。
执行此操作的简单方法是遍历向量的每个元素,但是否有更好的方法来执行此操作,例如使用带有 c++11 lambda 函数的库函数?
【问题讨论】:
标签: c++ c++11 vector stl lambda
您可以为此使用std::for_each:
#include <algorithm>
#include <vector>
...
std::vector<foo> v;
....
std::for_each(v.begin(), v.end(), [](foo& f) { f.bar1 *=2; });
它是否比普通循环更清晰/更简单是另一回事。在这种简单的情况下,基于范围的普通循环可能是更好的选择:
for (auto& f : v) f.bar1 *= 2;
【讨论】:
std::for_each 的使用,我能理解的唯一用途是使用 std::bind 将其传递给其他函数和那将是一团糟。
#include <algorithm> // for std::for_each
#include <vector>
void update_foos(std::vector<foo>& foos)
{
// Range-based for
for(auto& foo : foos)
{
foo.bar1 *= 2;
}
// std::for_each+lambda
std::for_each(std::begin(foos), std::end(foos), [](foo& f) { f.bar1 *=2; });
}
【讨论】: