for_each(iter1,iter2,op)的特点
1:for_each()算法非常的灵活,它可以以不同的方式存取、处理、修改每个元素
2:返回op的一个副本(可以用来保存仿函数的状态)
3:op的返回值会被忽略
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void print(int elem)
{
cout << elem << " ";
}
struct print2
{
void operator()(int elem)
{
cout << elem << " ";
}
};
//不改变容器内元素
int main()
{
vector<int>coll = { 1,2,3,4,3,5,6,7,8,9 };
//3种方法
for_each(coll.begin(), coll.end(), print);
cout << endl;
for_each(coll.begin(), coll.end(), print2());
cout << endl;
for_each(coll.begin(), coll.end(),
[](int elem)->void { cout << elem << " "; });
cout << endl;
}
//改动容器内的元素
int main()
{
vector<int>coll = { 1,2,3,4,3,5,6,7,8,9 };
copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
cout << endl;
for_each(coll.begin(), coll.end(), [](int& elem)->void { elem += 1; });
copy(coll.begin(), coll.end(), ostream_iterator<int>(cout, " "));
cout << endl;
}
如何利用for_each的返回值
class add
{
private:
int value;
public:
add(int v) :value(v) {}
void operator()(int& i)
{
i += value;
value++;
}
};
int main()
{
vector<int>c1 = { 1,2,3,4,5,6,7,8,9 };
vector<int>c2 = { 1,2,3,4,5,6,7,8,9 };
add f(1);//此时value=1
copy(c1.begin(),c1.end(),ostream_iterator<int>(cout," "));
cout << endl;
add f2=for_each(c1.begin(), c1.end(), f); //记录f最后的状态,此时f的value为10
copy(c1.begin(), c1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
copy(c2.begin(), c2.end(), ostream_iterator<int>(cout, " "));
cout << endl;
for_each(c2.begin(), c2.end(), f2);
copy(c2.begin(), c2.end(), ostream_iterator<int>(cout, " "));
cout << endl;
}