STL经常使用遍历算法for_each和transform的比較
Posted gccbuaa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL经常使用遍历算法for_each和transform的比較相关的知识,希望对你有一定的参考价值。
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; }
以上是关于STL经常使用遍历算法for_each和transform的比較的主要内容,如果未能解决你的问题,请参考以下文章