for_each()和transform()算法比较

1)STL 算法 – 修改性算法

 for_each()

 copy()

 copy_backward()

 transform()

 merge()

 swap_ranges()

 fill()

 fill_n()

 generate()

 generate_n()

 replace

 replace_if()

 replace_copy()

 replace_copy_if()

2)

 for_each() 速度快 不灵活

 transform() 速度慢 非常灵活

一般情况下:for_each所使用的函数对象,参数是引用,没有返回值

transform所使用的函数对象,参数一般不使用引用,而是还有返回值

int showElem2(int n)
{
	cout << n << " ";
	return n;
}

void main43_transform_pk_foreach()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);

	vector<int> v2 = v1;

	for_each(v1.begin(), v1.end(), showElem);

	//transform 对 函数对象的要求
	/*
c:\program files\microsoft visual studio 10.0\vc\include\algorithm(1119):
	参见对正在编译的函数 模板 实例化
		“_OutIt std::_Transform1<int*,_OutIt,
		void(__cdecl *)(int &)>(_InIt,_InIt,_OutIt,_Fn1,
		std::tr1::true_type)”的引用
1>          with
1>          [
1>              _OutIt=std::_Vector_iterator<std::_Vector_val<int,std::allocator<int>>>,
1>              _InIt=int *,
1>              _Fn1=void (__cdecl *)(int &)
1>          ]
	*/

	/*
	template<class _InIt,
	class _OutIt,
	class _Fn1> inline
		_OutIt _Transform(_InIt _First, _InIt _Last,
		_OutIt _Dest, _Fn1 _Func)
	{	// transform [_First, _Last) with _Func
		for (; _First != _Last; ++_First, ++_Dest)
			*_Dest = _Func(*_First);  //解释了 为什么 要有返回值
		return (_Dest);
	}
	*/
	transform(v2.begin(), v2.end(), v2.begin(), showElem2);
}

demo 完整的演示了for_each和transform算法的用法,以及

#include <iostream>
#include <cstdio>
#include <vector>
#include <list>
#include <algorithm>
#include <functional>
#include <iterator>

using namespace std;

class CMyShow
{
public:
	CMyShow()
	{
		num = 0;
	}
	void operator()(int &n)
	{
		num++;
		cout << n << " ";
	}
	void printNum()
	{
		cout << "num:" << num << endl;
	}
protected:
private:
	int num;
};

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

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

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

// for_each函数用法
void play_for_each()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);

	printV(v1);
	cout << endl;

	/*
	template<class _InIt,
	class _Fn1> inline
	_Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)
	{	// perform function for each element
	_DEBUG_RANGE(_First, _Last);
	_DEBUG_POINTER(_Func);
	return (_For_each(_Unchecked(_First), _Unchecked(_Last), _Func));
	} */

	//函数对象 回调函数入口地址
	for_each(v1.begin(), v1.end(), showElem);
	cout << endl;

	for_each(v1.begin(), v1.end(), CMyShow());
	cout << endl;

	CMyShow mya;
	CMyShow my1 = for_each(v1.begin(), v1.end(), mya); //给my1初始化
	mya.printNum();  //ma1和my1 是两个不同的对象
	my1.printNum();

	my1 = for_each(v1.begin(), v1.end(), mya);  //给my1赋值
	my1.printNum();
}

int  increase(int i)
{
	return i + 100;
}

// transform函数用法
void play_transform()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);

	printV(v1);
	cout << endl;

	//transform 使用回调函数
	transform(v1.begin(), v1.end(), v1.begin(), increase);
	printV(v1);
	cout << endl;

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

	//transform 使用 函数适配器 和函数对象
	list<int> mylist;
	mylist.resize(v1.size());

	transform(v1.begin(), v1.end(), mylist.begin(), bind2nd(multiplies<int>(), 10));
	printList(mylist);
	cout << endl;

	//transform 也可以把运算结果 直接输出到屏幕
	transform(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "), negate<int>());
	cout << endl;
}

//一般情况下:for_each所使用的函数对象,参数是引用,没有返回值
//transform所使用的函数对象,参数一般不使用引用,而是还有返回值

int showElem2(int n)
{
	cout << n << " ";
	return n;
}

void play_transform_pk_foreach()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);

	vector<int> v2 = v1;

	for_each(v1.begin(), v1.end(), showElem);

	//transform 对 函数对象的要求
	/*
	c:\program files\microsoft visual studio 10.0\vc\include\algorithm(1119):
	参见对正在编译的函数 模板 实例化
	“_OutIt std::_Transform1<int*,_OutIt,
	void(__cdecl *)(int &)>(_InIt,_InIt,_OutIt,_Fn1,
	std::tr1::true_type)”的引用
	1>          with
	1>          [
	1>              _OutIt=std::_Vector_iterator<std::_Vector_val<int,std::allocator<int>>>,
	1>              _InIt=int *,
	1>              _Fn1=void (__cdecl *)(int &)
	1>          ]
	*/

	/*
	template<class _InIt,
	class _OutIt,
	class _Fn1> inline
	_OutIt _Transform(_InIt _First, _InIt _Last,
	_OutIt _Dest, _Fn1 _Func)
	{	// transform [_First, _Last) with _Func
	for (; _First != _Last; ++_First, ++_Dest)
	*_Dest = _Func(*_First);  //解释了 为什么 要有返回值
	return (_Dest);
	}
	*/
	transform(v2.begin(), v2.end(), v2.begin(), showElem2);
}

int main()
{
	play_for_each();
	play_transform();
	play_transform_pk_foreach();

	return 0;
}

最新文章

  1. rnandroid环境搭建
  2. Web安全相关(四):过多发布(Over Posting)
  3. react-native 简单的导航
  4. a.redhat系统如何卸载默认jdk
  5. 剑指offer系列56---连续子数组的最大和
  6. JqGrid在IE8中表头不能分组的解决办法
  7. 关闭utorrent的广告
  8. spring jar包、文档官网下载
  9. 转:小心,apc可能导致php-fpm罢工!
  10. clone远程代码及push
  11. 1、初识socket
  12. [剑指Offer]8-二叉树的下一个节点
  13. kafka 的 docker 镜像使用
  14. bootstrap collaspe
  15. [WEB地图] 2017高德地图API WEB开发(key申请,地图搭建)简约教程
  16. 封装GetQueryString()方法来获取URL的value值(转载)
  17. 【树莓派】制作树莓派所使用的img镜像(二)
  18. 数据一致性和io类型
  19. asp.net中的时间日期选择控件
  20. 若p是与10互质的质数,则p-1个9能被p整除

热门文章

  1. Android Studio 中设置代码块自动补齐
  2. Velocity 语法及其在springMVC中的配置
  3. ejabberd mod_echo 解析
  4. RxJava操作符(06-错误处理)
  5. 在自己笔记本电脑上如何访问虚拟机的内容、包括可以使用ssh、访问tomcat、访问nginx
  6. SQLite 删除表(http://www.w3cschool.cc/sqlite/sqlite-drop-table.html)
  7. Hibernate缓存集成IMDG
  8. Dynamics CRM2016 Supported versions of Internet Explorer and Microsoft Edge
  9. Android初级教程初谈自定义view自定义属性
  10. Android Demo---如何敲出圆角的Button+圆角头像