C++STL算法篇之for_each遍历操作算法

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;
}
原创文章 23 获赞 1 访问量 358

猜你喜欢

转载自blog.csdn.net/weixin_44806268/article/details/105738781
今日推荐