STL經常使用遍歷算法for_each和transform的比較
阿新 • • 發佈:2017-08-05
end clas -m return checked int code 返回值 range
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的比較