C++ STL 中有关于for_each() 和 transform() 算法

#include<iostream>
using namespace std;

#include"functional"   //预定义函数对象的函数实现都写在这个库文件当中
#include"string"
#include<vector>
#include<list>
#include<algorithm>
#include"set"

//普通的打印输出 采用函数模板
template<typename T >

void printfVec(T &v1)
{
	for (T::iterator it = v1.begin(); it != v1.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

//回调函数
void showElemt(int &n)
{
	n=n + 1;
	cout << n << " ";
}

//函数对象
class C_ShowElemt
{
public:
	C_ShowElemt()
	{
		num = 0;
	}
	void operator()(int &n)
	{
		num++;
		cout << n << " ";
	}

public:
	int num;

};


//有关for_each() 和 transform() 算法的使用
void main41()
{
	vector<int> m_vec;

	m_vec.push_back(1);
	m_vec.push_back(3);
	m_vec.push_back(5);

	//使用for_each() 实现对这个容器的遍历  同时可以做到对容器元素的修改 本身就是一种可变值算法

	//1 采用一个回调函数 回调函数的入口地址
	for_each(m_vec.begin(), m_vec.end(), showElemt);
	cout << endl;

	//2 采用函数对象 并且for_each()的返回值也是一个函数对象

	for_each(m_vec.begin(), m_vec.end(), C_ShowElemt());
	cout << endl;

	//之前提过使用用类封装的函数对象可以实现记录状态 并且利用其返回值是一个类对象

	C_ShowElemt m_show = for_each(m_vec.begin(), m_vec.end(), C_ShowElemt());
	cout << " 记录调用的次数:" << m_show.num << endl;



}


//回调函数
int increase(int &a)
{
   return a + 100;
}


//有关于 transform()算法的使用
void main42()
{
	vector<int> m_vec;

	m_vec.push_back(1);
	m_vec.push_back(3);
	m_vec.push_back(5);

	printfVec<vector<int>>(m_vec);

	//回调函数的方法
	//遍历m_vec 再将值穿入 m_vec当中 并且采用回调函数实现值加100
	transform(m_vec.begin(), m_vec.end(), m_vec.begin(), increase);
	printfVec<vector<int>>(m_vec);

	//使用预定义的函数对象  negate<int>() 实现所有值变为负数
	transform(m_vec.begin(), m_vec.end(), m_vec.begin(), negate<int>());
	printfVec<vector<int>>(m_vec);

	//将容器中的值乘以十  并且放到链表当中
	list<int> myList;
	myList.resize(3);
	transform(m_vec.begin(), m_vec.end(), myList.begin(), bind2nd(multiplies<int>(),10));
	printfVec<list<int>>(myList);
	
	//将结果直接输出到屏幕上  使用输出流的迭代器
	transform(m_vec.begin(), m_vec.end(), ostream_iterator<int>(cout ," " ), negate<int>());
}

void main()
{
	//main41();//有关for_each() 算法的使用
	main42(); //有关于 transform()算法的使用
	system("pause");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值