C++ STL transform和for_each的基本使用

#include <algorithm>
#include <vector>
#include <iostream>
#include <functional >
#include <iterator>
using namespace std;

void printV(vector<int> &v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << "  ";
	}
}

void showEl(int &n)
{
	cout << n << "  ";
}

class MyShow
{
public:
	MyShow()
	{
		num = 0;
	}
	void operator()(int &n)
	{
		num++;
		cout << n << "  ";
	}

	void Print()
	{
		cout << num << "  ";
	}
private:
	int num;
};

void foreach_()
{
	vector<int> vec;
	vec.push_back(1);
	vec.push_back(3);
	vec.push_back(5);

	//第三个参数可传入函数对象或回调函数的入口地址,一般函数对象的参数为引用,没有返回值
	for_each(vec.begin(), vec.end(), showEl);
	cout << endl;

	for_each(vec.begin(), vec.end(), MyShow());
	cout << endl;

	/*
			template<class _InIt,
			class _Fn> inline
			_Fn for_each(_InIt _First, _InIt _Last, _Fn _Func)
			{	// perform function for each element [_First, _Last)
			_Adl_verify_range(_First, _Last);
			auto _UFirst = _Get_unwrapped(_First);
			const auto _ULast = _Get_unwrapped(_Last);
			for (; _UFirst != _ULast; ++_UFirst)
				{
				_Func(*_UFirst);
				}

			return (_Func);
			}
	*/
	//for_each返回一个函数对象
	MyShow my1;
	MyShow my2 = for_each(vec.begin(), vec.end(), my1);
	cout << endl;
	my1.Print();
	cout << endl;
	my2.Print();
	cout << endl;
}

int ADD(int n)
{
	return n + 10;
}

void transform_()
{
	vector<int> vec;
	vec.push_back(1);
	vec.push_back(3);
	vec.push_back(5);
	vector<int> vec2;
	vec2.resize(vec.size());

	//transform:将vec中的每个元素+10后存放到vec2中
	//使用回调函数  必须有返回值,一般不使用引用
	transform(vec.begin(), vec.end(), vec2.begin(), ADD);
	printV(vec2);
	cout << endl;

	//使用预定义函数对象
	transform(vec.begin(),vec.end(),vec2.begin(),negate<int>());//取反
	printV(vec2);
	cout << endl;

	//使用预定义函数对象和函数适配器
	transform(vec.begin(), vec.end(), vec2.begin(), bind2nd(multiplies<int>(), 10));//将每个元素*10
	printV(vec2);
	cout << endl;

	//直接输出,使用ostream_iterator输出流迭代器
	//ostream_iterator:第一个参数:输出到那个缓冲区,第二个参数:输出间距
	transform(vec.begin(), vec.end(), ostream_iterator<int>(cout, " "), negate<int>());//
	cout << endl;

}

void main()
{
	foreach_();
	transform_();

	system("pause");
}

for_each使用函数对象,一般函数对象的参数为引用,没有返回值,transform使用函数对象,必须有返回值,一般不使用引用

for_each速度快,不灵活,transform速度慢,非常灵活

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值