find_if(),plus,for_each()的用法
1、STL算法--find_if()
(1)、代码如下:
#include<iostream>#include<vector>#include<algorithm>#include<functional>usingnamespacestd;template<typenameType>classIsDiv{public:IsDiv(constType&divisor){this->divisor=divisor;}booloperator()(Type&t){returnt%divisor==0;}protected:private:Typedivisor;};intmain(void){vector<int>v2;for(inti=10;i<33;i++){v2.push_back(i);}inta=4;IsDiv<int>myDiv(a);//find_if(v2.begin(),v2.end(),myDiv);vector<int>::iteratorit;it=find_if(v2.begin(),v2.end(),IsDiv<int>(a));if(it==v2.end()){cout<<"容器中没有值是4的元素"<<endl;}else{cout<<"第一个被4整除的元素是:"<<*it<<endl;}return0;}
(2)、运行结果:
2、STL算法--plus的使用
(1)、代码如下:
#include<iostream>#include<vector>#include<algorithm>#include<functional>usingnamespacestd;//plus预定义好的函数对象,能实现不同数据+算法;//实现了数据类型和算法的分离======》通过函数对象技术实现的;////思考,怎么知道plus<type>是2个参数------>多看看源码;voidmain21(){plus<int>intAdd;intx=10;inty=20;intz=intAdd(x,y);cout<<"z:"<<z<<endl;plus<string>stringAdd;strings1="aaa";strings2="bbb";strings3=stringAdd(s1,s2);cout<<"s3:"<<s3<<endl;vector<string>v1;v1.push_back("bbb");v1.push_back("aaa");v1.push_back("ccc");v1.push_back("zzz");v1.push_back("ccc");v1.push_back("ccc");sort(v1.begin(),v1.end(),greater<string>());//降序排列;vector<string>::iteratorit;for(it=v1.begin();it!=v1.end();it++){cout<<*it<<endl;}//求“ccc”出现的字符串的个数;stringsc="ccc";//函数适配器:将函数和参数强行绑定;//equal_to<string>有2个参数,left参数来自容器,right参数来自sc,//bind2nd就是函数适配器:把预定义函数对象和第二个参数进行绑定;`intnum=count_if(v1.begin(),v1.end(),bind2nd(equal_to<string>(),sc));cout<<"num:"<<num<<endl;}intmain(void){main21();return0;}
(2)、运行结果:
3、STL算法--for_each()
(1)、代码如下:
#include<iostream>#include<vector>#include<algorithm>#include<functional>usingnamespacestd;voidprintV(vector<int>&v){vector<int>::iteratorit;for(it=v.begin();it!=v.end();it++){cout<<*it<<"";}cout<<endl;}voidshowElem(int&n){cout<<n<<"";}classMyShow{public:MyShow(){num=0;}voidoperator()(int&n){num++;cout<<n<<"";}voidprintNum(){cout<<"num:"<<num<<endl;}private:intnum;};intmain(void){vector<int>v1;v1.push_back(1);v1.push_back(3);v1.push_back(5);printV(v1);//第三个参数是:函数对象/回掉函数//for_each(v1.begin(),v1.end(),showElem);//利用的是回调函数for_each(v1.begin(),v1.end(),MyShow());//利用的是函数对象(这个类中重载了())//函数的返回值是函数对象cout<<endl;MyShowmy1=for_each(v1.begin(),v1.end(),MyShow());//利用的是函数对象(这个类中重载了())my1.printNum();return0;}
(2)、运行结果:
4、for_each()和transform()的区别
(1)、代码如下:
#include<iostream>#include<vector>#include<algorithm>#include<functional>usingnamespacestd;voidshowElem(int&n){cout<<n<<"";}intshowElem2(int&n){cout<<n<<"";returnn;}//for_each和transform的本质区别://结论://1、一般情况下,for_each所使用的函数对象,参数是引用,没有返回值;//2、transform所使用的函数对象,参数一般不使用引用,而是还有返回值;intmain(void){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(v2.begin(),v2.end(),v2.begin(),showElem2);//transform对回调函数的要求;返回值必须有cout<<endl;return0;}
运行结果:
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。