您的位置:首页 > 其它

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

2015-07-10 14:12 399 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: