stl算法_foreach和transform基本使用,算法比较以及源码追踪

来源:互联网 发布:深圳淘宝开店培训 编辑:程序博客网 时间:2024/06/05 15:25

传智扫地僧课程学习笔记。



直接看老师示例代码,

#include <iostream>using namespace std;#include "string"#include <vector>#include <list>#include "set"#include <algorithm>#include "functional"#include "iterator"  //输出流迭代器的头文件void printV(vector<int> &v){for (vector<int>::iterator it=v.begin(); it!=v.end(); it++){cout << *it << " ";}}void printList(list<int> &v){for (list<int>::iterator it=v.begin(); it!=v.end(); it++){cout << *it << " ";}}void showElem(int &n){cout << n << " ";}class CMyShow{public:CMyShow(){num = 0;}void operator()(int &n){num ++;cout << n << " ";}void printNum(){cout << "num:" << num << endl;}protected:private:int num;};void main41_foreach(){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;}void main42_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 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>          with1>          [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 _Funcfor (; _First != _Last; ++_First, ++_Dest)*_Dest = _Func(*_First);  //解释了 为什么 要有返回值return (_Dest);}*/transform(v2.begin(), v2.end(), v2.begin(), showElem2);}void main(){//main41_foreach();//main42_transform();// main43_transform_pk_foreach();cout<<"hello..."<<endl;system("pause");return ;}


0 0
原创粉丝点击