导言
for_each()算法非常灵活,它允许我们以不同的方式访问、处理、修改每一个元素。虽然很方便,但是随着C++11的到来,基于范围的for循环提供了更方便更自然的行为,因此,for_each的重要性逐渐丧失,由Range-based for 循环取代。下面介绍for_each的4中常用用法。
正文
1. for_each()传入Lambda
下面的例子把每一个元素传给一个lambda(传值的方式),后者将它获得的元素都打印出来:
vector<int> coll = {1, 2, 3, 4, 5, 6};
for_each(coll.begin(), coll.end(),// range
[](int elem){ // operation
cout << elem << " ";
}
);
下面的例子利用lambda修改每一个元素(以传引用的方式):
for_each(coll.begin(), coll.end(),
[](int &elem){
elem += 10;// 每一个元素都加10
}
);
2. for_each()传入普通函数
上面的Lambda可被普通函数取代,不过在实际的代码过程中长使用Lambda,因为Lambda更为简洁,高效。这里仅仅为了学习理论。下面的代码使用普通函数取代了Lambda:
void Print(int elem){
cout << elem << " ";
}
for_each(coll.begin(), coll.end(),// range
Print;// 注意是Print
);
3. for_each()传入函数对象
class Test{
private:
int _value;
public:
Test(int value) : _value(value) {}
int operator()(int &v) const{// functor 需要重载operator()运算符
v += _value;
return v;
}
};
// coll 中的每个元素都加10
for_each(coll.begin(), coll.end(),
Test(10); // operation
);
4. for_each()的返回值
for_each()算法有个独门绝技,其他算法没有,就是可以==传回其function object==。请看下面的代码:
见C++标准库第482页