关闭

STL常用遍历算法for_each和transform的比较

标签: 算法stl遍历for_eachtransform
1378人阅读 评论(0) 收藏 举报
分类:

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;
}

0
0
查看评论

在C++中实现foreach循环,比for_each更简洁!

python,c#,java里面都有类似于foreach的结构,stl里面虽然有for_each这个函数,但是感觉使用还是太繁琐了一些,所以就自己实现了一个。 先来看看stl里面的for_each函数,官方文档上的原型如下: 1Function for_each (InputIterato...
  • imxiangzi
  • imxiangzi
  • 2015-11-20 22:23
  • 4104

C++11 lambda表达式在for_each和transform算法下的使用

以前,在lambda表达式没有进入标准的时候,对容器的遍历等涉及到使用函数指针的情况,一般人会懒得使用std::for_each,或std::transform,也许只是一个短短的几句话,却要单独写个函数,或函数对象,写的代码反而不如自己用for循环来的快。 但是,C++11引入了lambda表达式...
  • czyt1988
  • czyt1988
  • 2015-02-08 13:52
  • 3703

STL::list 遍历元素方法

void printit(DAT vals) { printf("ss= %d\n",vals.val); } list mylist; DAT mydat; for(int i=0;i<10;i++) { mydat.val = rand() % 1...
  • W_SX12553
  • W_SX12553
  • 2013-01-05 09:53
  • 14917

stl容器遍历测试

使用vc2010,对vector,set,map,list,deque,queue的遍历速度进行了下测试,代码如下 #include #include #include #include #include #include #include #include int main...
  • jwybobo2007
  • jwybobo2007
  • 2013-03-11 14:54
  • 3438

STL_算法_for_each

C++ Primer 学习中。。。   简单记录下我的学习过程 (代码为主) 所有容器适用 for_each(b,e,p) 1、使用for_each()算法遍历数据 2、使用for_each()和函数对象修改数据 3、使用fo...
  • u010579068
  • u010579068
  • 2016-01-13 15:31
  • 3194

简单的程序诠释C++ STL算法系列之一:for_each

C++STL的非变易算法(Non-mutating algorithms)是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。      for_each用于逐个遍历容器元素,它对迭代器区间[first,last)所...
  • jerryjbiao
  • jerryjbiao
  • 2011-09-27 20:24
  • 18386

STL中vector以及 for_each几种用法

/* * vector_test.cpp * * Created on: 2015-3-22 * Author: gino */ #include #include #include using namespace std; void printElem(in...
  • u011641885
  • u011641885
  • 2015-03-22 19:13
  • 723

STL for_each 用法

void func(const int& s) { cout<<s<<endl; } int main() { std::deque de; de.push_back(1); de.push_back(2); de.push_back(3); de.pu...
  • w18767104183
  • w18767104183
  • 2014-04-20 21:37
  • 863

【C++ STL应用与实现】26: 如何使用std::for_each以及基于范围的for循环 (since C++11)

本文总结了STL算法中for_each, for_each算法很常用,以致于C++11定义了一个新的语法: `range based for loop`, 也就是基于范围的for循环,直接在语法层面把for_each的功能给实现了。本文给出一些使用`for_each`和rang-based for ...
  • elloop
  • elloop
  • 2015-12-23 00:25
  • 9220

STL——for_each的用法

描述: template Function for_each (InputIterator first, InputIterator last, Function f); Apply function to range Applies function f&#...
  • lalor
  • lalor
  • 2012-07-14 12:57
  • 9994
    个人资料
    • 访问:424378次
    • 积分:8215
    • 等级:
    • 排名:第2965名
    • 原创:401篇
    • 转载:30篇
    • 译文:11篇
    • 评论:87条
    博客专栏