05stl资源不正经程序员-基础教程_第1页
05stl资源不正经程序员-基础教程_第2页
05stl资源不正经程序员-基础教程_第3页
05stl资源不正经程序员-基础教程_第4页
05stl资源不正经程序员-基础教程_第5页
免费预览已结束,剩余64页可下载查看

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

STL概从模块化设计,到面向对象(objectoriented),为的就是复用性的提升。(datastructures)和算法(algorithm)都未能有一套标准。大量程序员被迫从事大量重复的立性、弹性、交互操作性(相互合作性,interoperability),诞生了STL。STL基本概称。现在主要出现在c++中,但是在引入c++之前该技术已经存在很长时间了。STL从广义上分为:容器(container)算法(algorithm)迭代器(iterator),容器和算法STL传统的由函数和类组成的库来说提供了更好的代码重用机会。STL(StandardTemplateLibrary)标准模板库,在我们c++标准程序库中隶属于STL的占到了80%以上。STL六大组件简STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代角度来看,STL容器是一种classtemplate。法是一种functiontempalte.一种将operator*,operator->,operator++,operator--等指针相关操作予以重载的classtemplateSTL遍历自己的元素。原生指针(nativepointer)也是一种迭代器。了operator()的class或者classtemplate适配器:置、空间管理、空间释放的classtempalte.STL优STL是C++的一部分因此不用额外安装什么它被内建在你的编译器之内的程序员可以不用思考STL具体的实现过程,只要能够熟练使用STL就了。这样他们就可以把精力放在程序开发的别的方面STL具有高可重用性,高性能,高移植性,跨平台的优点中识,已经给大家介绍了高性能:如map可以高效地从十万条记录里面查找出指定的记录,因为是采用树的变体实现的高移植性:如在项目A上用STL编写的模块,可以直接移植到项目B上·STL之父Alex (STL创建者·STL三大组容或插入的操作改变这个位置。Vector容器、Deque容器、List容器等。关联式容器另一个显著特点是:在值中选择一个值作为关键字key,这个关键字对值起到索引的作用,方便查找。Set/multiset容器Map/multimap容器算STL迭代迭代器的设计思维-STL的关键所在,STL的中心思想在于将容器(container)和算法容器和算法的泛型化并不,c++的classtemplate和functiontemplate可分别达到随机迭代提供读写操作,并能以跳跃的方式2.3案#define#defineusingnamespacestd;//STLvoidvector<int>v;//STL中的标准容器之一:动态数组v.push_back(1//vectorvector<int>::iteratorpStartv.begin//vectorbeginvector<int>::iteratorpEndv.end//vectorendwhile(pStart!=pEnd){cout<<*pStart<<"";}cout<<countintn=count(pStart,pEnd,5);cout<<"n:"<<n<<endl;}//STLclass{Teacher(intage)intvoidvector<Teacher>v;// TeacherTeachert1(10),t2(20),t3(30);vector<Teacher>::iteratorpStart=v.begin();vector<Teacher>::iteratorpEnd=v.end();while(pStart!=cout<<pStart->age<<"";}cout<<} Teachervoidvector<Teacher*>v TeacherTeacher*t1=newTeacher(10);Teacher*t2=newTeacher(20);Teacher*t3=newTeacher(30);vector<Teacher*>::iteratorpStart=v.begin();vector<Teacher*>::iteratorpEnd=v.end();while(pStart!=cout<<(*pStart)->age<<"";}cout<<}voidtest04(){vector<vector<int>>v;for(inti=0;i<{v2.push_back(i*10);}for(vector<vector<int>>::iteratorit=v.begin();it!={for(vector<int>::iteratorsubIt=(*it).begin();subIt!=(*it).end();subIt++){cout<<*subIt<<"}cout<<}}intreturnEXIT_SUCCESS;}常用string容string容器基本概以C++标准库定义了一种string类,定义在头文件<string>。String和cstringchar*,char*findcopydelete替换replacestring容器常用操stringstring();//string();//创建一个空的字符串如stringstring(conststring&str);//使用一个string对象初始化另一个string对string(constchar*s);//使用字符串s始string(intn,charc);//使用n字符c始stringstring&string&operator=(constchar*s);//char*类型字符串值给当前的字符串string&operator=(conststring&s);//把字符串s给当前的字符串string&operator=(charc);//字符赋值给当前的字符串string&assign(constchar*s);//把字符串s给当前的字符string&assign(constchar*s,intn);//把字符串s前n字符赋给当前的字符string&assign(conststring&s);//把字符串s给当前字符string&assign(intn,charc);//用n字符c给当前字符string&assign(conststring&s,intstart,intn);/sstart始n字符赋值给字符stringchar&char&operator[](intn);//通过[]方式取字char&at(intn);//通过at法获取字stringstring&string&operator+=(conststring&str);//重载+=操作符string&operator+=(constchar*str);//重载+=操作符string&operator+=(constcharc);//重载+=操作符string&append(constchar*s);//把字符串s接到当前字符串结string&append(constchar*s,intn);//把字符串s前n字符连接到当前字符串结string&append(conststring&s);//同string&append(conststring&s,intpos,intn);//把字符串s从pos始的n字符连接string&append(intn,charc);//在当前字符串结尾添加n字符stringintintfind(conststring&str,intpos0)const;查找str一次出现位置,从pos始查intfind(constchar*s,intpos0)const;//查找s一次出现位置,从pos始查intfind(constchar*s,intpos,intn)const;//从pos置查找s前n字符第一次位intfind(constcharc,intpos0)const;//查找字符c一次出现位intrfind(conststring&str,intposnpos)const;//查找str后一次位置,从pos始查intrfind(constchar*s,intposnpos)const;//查找s后一次出现位置,从pos始查找intrfind(constchar*s,intpos,intn)const;//从pos找s前n字符最后一次位置intrfind(constcharc,intpos=0)const;//查找字符c后一次出现位置string&replace(intpos,intn,conststring&str);替换从pos始n字符为字符string&replace(intpos,intn,constchar*s);替换从pos始的n字符为字符串stringcompare数在>时返回1,<时返回1,==时返回0大写的A小写的compare(conststring&s)const;//与字符串sintcompare(constchar*s)const;//与字符串sstringstringstringsubstr(intpos0,intnnpos)const;//返回由pos始的n字符组成的字符stringstring&insert(intpos,constchar*s);//string&insert(intpos,constchar*s);//插入字符串string&insert(intpos,conststring&str);插入字符串string&insert(intpos,intn,charc);//在指定位置插入n字符string&erase(intpos,intnnpos);//删除从Pos始的n字string和c-style//string转char*//string转char*stringstr="";constchar*cstr=//char*char*s="";stringstr(s);c+constchar*stringstring象到C_stringstringc_str(string对象对应的C_string.为了修为了修改string字符串的内容,下标操作符[]和at都会返回字符 coutcout<<s<<cout<<(int*)s.c_str()<<//a=//b=s=cout<<s<<cout<<(int*)s.c_str()<<a=b=strings=char&a=s[2];char&b=小练stringvector容vector容器基本概vector的数据安排以及操作方式,与array非常相似,两者的唯一差别在于空间的运用的灵活性。Array是静态空间,一旦配置了就不能改变,要换大一点或者小一点的空间,释放原来的空间。Vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素。因此vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们arrayVectorvectorvectorvectorvector迭代支持随机存取,而普通指针正有着这样的能力。所以vector提供的是随机迭代器(RandomAccessIterators).it1Int*,it2#define#define_CRT_SECURE_NO_WARNINGSusingnamespacestd;intmain(){vector<int>for(inti=0;i<10;i++){coutv.capacityendl;v.capacity()容器的容}returnEXIT_SUCCESS;}vector的数据结Vector所采用的数据结构非常简单,线性连续空间,它以两个迭代器_Myfirst和_Mylast_Myend为了降低空间配置时的速度成本,vector实际配置的大小可能比客户端需求大一些,注意。vectorAPI操vectorvector<T>vector<T>v;采用模板实现类实现,默认构造函vector(v.begin(),v.end());//将v[begin(),end())区间中的元素拷贝给本身。vector(n,elem);//构造函数将nelem贝给本身。vector(constvector&vec);//拷贝构造函数//例子用第二个构造函数们可以...intarr[]={2,3,4,1,9};vector<int>v1(arr,arr+sizeof(arr)/vectorassign(beg,assign(beg,end);//将[beg,end)区间中的数据拷贝赋值给本身。assign(n,elem);//将nelem贝赋值给本身。vector&operator=(constvector&vec);//重载等号操作swap(vec);//vec与本身的元素互换vectorresize(intnum);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器resize(intnum,elem);//重新指定容器的长度为num,若容器变长,则以elem值填充新位置。果容器变短,则末尾超出容器长>度的元素被删除capacity();//capacity();//reserve(intlen);//容器预留len个元素长度,预留位置不初始化,元素不 vectorat(intat(intidx);//返回索引idx所指的数据,如果idx越界,抛出out_of_range异常operator[];//返回索引idx所指的数据,越界时,运行直接报back();//返回容器中最后一个数据元vectorinsert(const_iteratorinsert(const_iteratorpos,intcount,ele);//迭代器指向位置pos入count元素ele.push_back(ele);//尾部插入元素elepop_back();//删除最后一个元erase(const_iteratorstart,const_iteratorend);//删除迭代器从startend之间的元erase(const_iteratorpos);//删除迭代器指向的元素vector小案巧用swap#define#define_CRT_SECURE_NO_WARNINGSusingnamespacestd;intmain(){vector<int>for(inti=0;i<100000;i++){}cout<<"capacity:"<<v.capacity()<<coutcout<<"size:"<<v.size()<<cout<<"capacity:"<<v.capacity()<<endl;cout<<"size:"<<v.size()<<endl;cout<<"capacity:"<<v.capacity()<<endl;cout<<"size:"<<v.size()<<endl;returnEXIT_SUCCESS;}reserve#define#define_CRT_SECURE_NO_WARNINGSusingnamespacestd;intmain(){vector<int>int*pStart=NULL;intcount=0;for(inti=0;i<100000;i++){if(pStart!=&v[0]){pStart=&v[0];}}}cout<<"count:"<<count<<endl;return}deque容deque容器基本概Vector容器是单向开口的连续内存空间,deque则是一种双向开口的连续线性空间。Dequevectordequedeque不足而重新配置一块更大空间,然后元素,再释放旧空间”这样的事情在deque身上是不会发生的。也因此,deque没有必须要提供所谓的空间保留(reserve)功能.dequeRandomAccessIterator,但是它的迭代器并不是普通的指vector我们应该尽可能的使用vector,而不是deque。对deque进行的排序操作,为了最高效率可将deque先完整的到一个vector中对vector容器进行排序再回deque容器实现原Deque容器是连续的空间,至少逻辑上看来如此,连续现行空间总是令我们联想到一个假象,事实上(1)申请更大空间(2)原数据新空间(3)释放原空间三步骤,如果不是vector每次配置新的空间时都留有,其成长假象所带来的代价是非常昂贵的。Dequedeque既然deque是分段连续内存空间,那么就必须有控制,维持整体连续的假象,数Dequemap(STLmap连续性内存空间,称作缓冲区。缓冲区才是deque的空间的主体dequedequedeque<T>deque<T>deqT;//默认构造形deque(beg,end);//构造函数将[beg,end)区间中的元素拷贝给本身。deque(n,elem);//构造函数将nelem贝给本身。deque(constdeque&deq);//拷贝构造函数dequeassign(beg,assign(beg,end);//将[beg,end)区间中的数据拷贝赋值给本身。assign(n,elem);//将nelem贝赋值给本身。deque&operator=(constdeque&deq);重载等号操作swap(deq);//deq与本身的元素互dequedeque.resize(num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。deque.resize(num,elem);//重新指定容器的长度为num,若容器变长,则以elem值填充新位置,果容器变短,则末尾超出容器长度的元素被删除dequepop_front();//删除容器第一个数dequeat(idx);//at(idx);//返回索引idx指的数据,如果idx界,抛出out_of_range。operator[];//返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。back();//返回最后一个数dequeinsert(pos,elem);//insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据的位置insert(pos,n,elem);//在pos位置插入nelem数据,无返回值insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值dequeclear();//clear();//移除容器的所有数erase(pos);//删除pos置的数据,返回下一个数据的位置。案例(作业//1.创建五名选手,放到vector//2.遍历vector容器,取出来每一个选手,执行for循环,可以把10个评//3.sort算法对deque容器中分数排序,pop_backpop_front去除最高和//4.deque容器遍历一遍,累加分数,累加分数 .score=stack容stack容器基本概stack(FirstInLastOut,FILO)的数据结构,它只有一个出口,形式如何其他方法可以存取stack的其他元素。换言之,stack不允许有遍历行为。有元素推入栈的操作称为:push,stackstack没有迭代机会被外界取用。Stack不提供遍历功能,也不提供迭代器。stackstackstack<T>stack<T>stkT;//stack采用模板类实现,stack对象的默认构造形式stack(conststack&stk);//拷贝构造函stackstack&stack&operator=(conststack&stk);//重载等号操作stackpush(elem);//push(elem);//向栈顶添加元stackempty();//empty();//判断堆栈是否为size();//返回堆栈的大queue容queue容器基本概Queue(FirstInFirstOut,FIFO)的数据结构,它有两个出口queue没有迭代有机会被外界取用。Queue不提供遍历功能,也不提供迭代器。queuequeuequeue<T>queue<T>queT;//queue采用模板类实现,queue对象的默认构造形式queue(constqueue&que);//拷贝构造函queuefront();//返回第一个元queuequeue&queue&operator=(constqueue&que);//重载等号操作queueempty();//empty();//判断队列是否为size();//返回队列的大list容list容器基本概相较于vector的连续线性空间,list就显得负责许多,它的好处是每次插入或者删除一个元素,就是配置或者释放一个元素的空间。因此,list对于空间的运用有精准,一点也不浪费。而且,对于任何位置的元素插入或元素的移除,list是常数时间。ListvectorList采用动态分配,不会造成内存浪费和溢list容器的迭代ListvectorListlist的是BidirectionalIterators.list容器的数据结list#define#define_CRT_SECURE_NO_WARNINGSusingnamespacestd;intmain(){list<int>for(inti=0;i<10;i++){}list<int>::_Nodeptrnode=myList._Myhead->_Next;for(inti=0;i<myList._Mysize*2;i++){cout<<"Node:"<<node->_Myval<<endl;node=node->_Next;if(node==myList._Myhead){node=node->_Next;}}returnEXIT_SUCCESS;}listlistlist<T>lstT;//listlist<T>lstT;//list用采用模板类实现,对象的默认构造形式:list(beg,end);//构造函数将[beg,end)区间中的元素拷贝给本身。list(n,elem);//构造函数将nelem贝给本身。list(constlist&lst);//拷贝构造函数listpush_front(elem);//在容器开头插入一个元pop_front();//pop_front();//insert(pos,elem);//poseleminsert(pos,n,elem);//posn个elem数据,无返回值。insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。erase(pos);//删除pos位置的数据,返回下一个数据的位置。remove(elem);//删除容器中所有与elemlistresize(num,elem);//重新指定容器的长度为num,若容器变长,则以elem填充新位置。如果容器变短,则末尾超出容器长度的元素被删除listassign(beg,assign(beg,end);//将[beg,end)区间中的数据拷贝赋值给本身。assign(n,elem);//将nelem贝赋值给本身。list&operator=(constlist&lst);//重载等号操作swap(lst);//将lst与本身的元素互换listfront();//front();//返回第一个元素back();//返回最后一个元素listreverse();//reverse();//反转链表,比如lst包含1,3,5元素,运行此方法后,lst就包含5,3,1元素sort();//listset/multiset容器基本概setSet的特性是。所有元素都会根据元素的键值自动被排序。Set的元素不像map那样可以同时拥有实值和键值,setSetsetsetsetsetsetsetset的iterator是一种const_iterator.setlistmultisetmultiset特性及用法和setset上面我们介绍了二叉搜索树,那么当一个二叉搜索树的左子树和右子树不平衡的时97我们的输入或者经过我们插入或者删除操作,二叉树失去平衡,造成搜索效率降低。RB-tree(树)为二叉树的一种setsetset<T>set<T>st;//set默认构造函数mulitset<T>mst;//multiset认构造函数:set(constset&st);//拷贝构造函数setset&set&operator=(constset&st);//重载等号操作swap(st);//交换两个集合容setsize();//size();//返回容器中元素的数empty();//判断容器是否为seterase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器erase(beg,end);//删除区间[beg,end)的所有元素,返回下一个元素的迭代器erase(elem);//删除容器中值为elem的元素setfind(key);//find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返count(key);//查找键key的元素个lower_bound(keyElem);//返回第一个key>=keyElem素的迭代器。upper_bound(keyElem);//返回第一个key>keyElem素的迭代器。set的返回 指定set排序规则voidtest01(){set<int>pair<set<int>::iterator,bool>ret=s.insert(10);if(ret.second){cout*ret.first}cout*ret.first}ret=s.insert(10);cout*ret.first}cout*ret.first}} booloperator()(intv1,intv2){returnv1>v2;}voidsrand((unsigned pare02>s;for(inti=0;i<10;i++){s.insert(rand()%100);}for(set<int, pare02>::iteratorit=s.begin();it!=s.end();it++){cout<<*it<<"";}cout<<} }

(stringname,intage){this->mName=name;this->mAge=age;stringmName;intmAge;bool&&returnp1.mAge>}void,pare03>p1("aaa",p2("bbb",p3("ccc",p4("ddd",for,pare03>::iteratorit=s.begin();it!=s.end();cout<<"Name:"<<it->mName<<"Age:"<<it->mAge<<}}别用pair的两个公有属性first和second。类模板:template<classT1classT2struct////法创建一个对pair<string,int>pair1(string("name"),coutpair1.firstendl; pair第一个coutpair1.second pair第二个pair<string,int>pair2=make_pair("name",30);cout<<pair2.first<<endl;cout<<pair2.second<<//pair=pair<string,int>pair3=pair2;cout<<pair3.first<<endl;cout<<pair3.second<<endl;map/multimap基本概时拥有实值和键值,pair,mapmapmapmapMaplistMultimapmapmultimapMap和multimap都是以树为底层实现机制map/multimapmapmap<T1,map<T1,T2>mapTT;//map认构造函map(constmap&mp);//拷贝构造函mapmap&map&operator=(constmap&mp);//重载等号操作swap(mp);//交换两个集合容mapsize();//size();//返回容器中元素的数empty();//判断容器是否为mapmap.insert(...);map.insert(...);往容器插入元素,返回pair<iterator,bool>map<int,string>mapStu;一种pair方式插入对mapStu.insert(pair<int,string>(3, 二种pair方式插入对mapStu.inset(make_pair(-1,"校长三种value_type方式插入对mapStu.insert(map<int,string>::value_type(1,"四种过数组的方式插入mapStu[3]小刘mapStu[5]小王mapclear();//clear();//删除所有元erase(pos);//删除pos代器所指的元素,返回下一个元素的迭代器。erase(beg,end);//删除区间[beg,end)的所有元素返回下一个元素的迭代器。erase(keyElem);//删除容器中keykeyElem对组。mapfind(key);//find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;/若不存在,返count(keyElem);//返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是1。对multimap说,值可能大于1。lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器multimap案//公司今天招聘了5个员工,5名员工进入公司之后,需要指派员工在那个部门工//人员信息有:工资等组//通过Multimap行信息的插入存//分部门显示员工信息显示全部员工信#define#defineusingnamespacestd;//multimap5,5 Multimap#defineSALE_DEPATMENT1//销售部门#defineDEVELOP_DEPATMENT2//研发部门#defineFINACIAL_DEPATMENT3#defineALL_DEPATMENT4//所有部门class{stringname//员工intage;//员工doublesalary;//员工工资 e;//员工void >&stringseed=for(inti=0;i<5;"员工";+=p.age=rand()%30+20;p.salary=rand()%20000+10000; e= }} >&vlist, >&intoperate1for(vector< >::iteratoritvlist.beginitvlist.endit++){cout<<"当前员工信息:"<<endl;cout<<" :"<<it->name<<" :"<<it->age<<"工资:"<<it->salary<<" :"<<it-> e<<endl;cout"请对该员工进行部门分配(123

scanf("%d",&operate);while(true){ifoperateSALE_DEPATMENT){//将该员工加入到销售部门plist.insert(make_pair(SALE_DEPATMENT,*it));}elseif(operate==DEVELOP_DEPATMENT){plist.insert(make_pair(DEVELOP_DEPATMENT,*it));}elseif(operate==FINACIAL_DEPATMENT){plist.insert(make_pair(FINACIAL_DEPATMENT,*it));}cout"您的输入有误,请重新输入(123}}

scanf("%d",}coutcout<<"***********************************************************"<<}void >&plist,intif(myoperate==for(multimap<int, >::iteratorit=plist.begin();it!=plist.end();it++){cout<< :"<<it-><< :"<<it->second.age<<工资:"<<it->second.salary<< :"<<it- e<<}} >::iteratorit=plist.find(myoperate);intdepatCount=plist.count(myoperate);intnum=if(it!=while(it!=plist.end()&&num<cout<< :"<<it-><< :"<<it->second.age<<工资:"<<it->second.salary<<" :"<<it->second. e<<endl;}}}void >&plist,intswitch{caseprintList(plist,SALE_DEPATMENT);caseprintList(plist,DEVELOP_DEPATMENT);caseprintList(plist,FINACIAL_DEPATMENT);caseprintList(plist,ALL_DEPATMENT);}} >&intflag=-1;intisexit=0;while(true){cout"请输入您的操作((1234scanf("%d",switch{case List(plist,SALE_DEPATMENT);case List(plist,DEVELOP_DEPATMENT);case List(plist,FINACIAL_DEPATMENT);case List(plist,ALL_DEPATMENT);casecaseisexit=1;coutendl;}if(isexit==}}}int>vlist5 plist ByGroup(vlist,return}STL容器使用时是是否否否key否慢慢快快keykey----vector的使用场景:比如软件历史操作记录的,我们经常要查看历史记录,比如deque的使用场景:比如排队购票系统,对排队者的可以采用deque,支持头vector,则头端移除时,会移动大量的数vectordeque一:vector.at()比deque.at()效率高,比如vector.at(0)是固定的,deque的开始位 二:如果有大量释放操作的话,vector三:deque支持头部的快速插入与快速移除,这是deque的优点。list的使用场景:比如车乘客的,随时可能有乘客下车,支持频繁的不确实set的使用场景:比如对游戏的个人得分记录的,要求从高分到低分的map的使用场景:比如按ID号十万个用户,想要快速要通过ID查找对应的用户。二叉树的查找效率,这时就体现出来了。如果是vector容器,的情况下可能常用函数对objectfunctor获取两个参数,就将这个类称为“二元仿函数”(binaryfunctor。函数对象的作用主要是什么?STLtemplateclassMyPrint{{m_Num=}intvoidoperator()(int{cout<<num<<endl;}//数,可以有返回值void{MyPrintmyPrint;}//void{MyPrintmyPrint;cout<<myPrint.m_Num<<}voiddoBusiness(MyPrintprint,int{}voidtest03(){//参数 函数对}234谓class{booloperator()(int{returnnum>class{booloperator()(int{returnnum>}voidtest01(){vector<int>for(inti=0;i<10;i{}vector<int>::iteratorit= find_if(v.begin(),v.end(),if(it=={cout没有找到}{cout找到了*it}} {booloperator()(intnum1,int{returnnum1>}void{vector<int>v;//sort(v.begin(),for(vector<int>::iteratorit=v.begin();it!={cout<<*it<<"}cout<<endl;cout<<"

"<<//sort(v.begin(), for(vector<int>::iteratorit=v.begin();it!=v.end();{cout<<*it<<"}cout<<}内建函数对STL时对象来履行函数功能。使用内建函数对象,需要引入头文件#include<functional>。6negatetemplate<classT>Tplus<T>//template<classT>Tplus<T>//加法仿函数template<classT>Tminus<T>//减法仿函数template<classT>Tmultiplies<T>//乘法仿函数template<classT>Tdivides<T>//除法仿函数template<classT>Tmodulus<T>//取模仿函数template<classT>Tnegate<T>//取反仿函6template<classT>boolequal_to<T>//template<classT>boolequal_to<T>//等于template<classT>boolnot_equal_to<T>//不等于template<classT>boolgreater<T>//大于template<classT>boolgreater_equal<T>//大于等于template<classT>boolless<T>//小于template<classT>boolless_equal<T>//小于等逻辑运算类运算函数,nottemplate<classtemplate<classT>boollogical_and<T>//逻辑与template<classT>boollogical_or<T>//逻辑或template<classT>boollogical_not<T>//逻辑非void{negate<int>cout<<n(50)<<}voidtest02(){plus<int>cout<<p(10,20)<<}voidtest03(){vector<int>srand((unsignedint)time(NULL));for(inti=0;i<10;i++){v.push_back(rand()%}for(vector<int>::iteratorit=v.begin();it!=v.end();cout<<*it<<"}cout<<sort(v.begin(),v.end(),for(vector<int>::iteratorit=v.begin();it!=v.end();cout<<*it<<"}cout<<}3.1.4数对象适配bind1st100//for_each(v.begin(),v.end(),//如果我们想使用绑定适配器,需要我们自己的函数对象继承binary_functionclassMyPrint:public{voidoperator()(intv1,intv2){cout<<"v1=:"<<v1<<"v2=:"<<v2<<"v1+v2=:"<<(v1+v2)}voidtest01(){for(inti=0;i<10;{}coutendl;intx;cin>>for_each(v.begin(),v.end(),bind1st(MyPrint(),//for_each(v.begin(),v.end(),bind2nd(MyPrint(),x}//总结:bind1st和bind2nd//bind1st//bind2nd//bind1stbind2ndclassGreaterThenFive:public{booloperator()(intv){returnv>}voidtest02(){vector<int>for(inti=0;i<{}//vector<int>::iteratorit=find_if(v.begin(),v.end(),GreaterThenFive());//vector<int>::iteratoritfind_if(v.beginv.end(),not1(GreaterThenFive()));//返回第一个小于5迭代器vector<int>::iteratorit=find_if(v.begin(),v.end(),(bind2nd(greater<int>(),5)));if(it==v.end()){}{}

coutcout*it//排序sort(v.begin(),v.end(),for_each(v.begin(),v.end(),[](intval){cout<<val<<"";}//not1//not2voidMyPrint03(intv,int{cout<<v+v2<<"} voidtest03(){vector<int>for(inti=0;i<10;{}ptr_fun(for_each(v.begin(),v.end(),bind2nd(ptr_fun(MyPrint03),}{(stringname,int{m_Name=name;m_Age=age;}void cout"Namem_NameAgem_Age}void{m_Age+=}intm_Age;void {cout<< :"<<p.m_Name<< :"<<p.m_Age<<void{vector< p1("aaa",p2("bbb",p3("ccc",p4("ddd",40);//for_each(v.begin(),v.end(),//利用mem_fun_ref for_each(v.begin(),v.end(), ////for_each(v.begin(),v.end(),//for_each(v.begin(),v.end(),} void *>p1("aaa",p2("bbb",p3("ccc",p4("ddd",for_each(v1.begin(),v1.end(),}//如果容器存放的是对象指针,那么用算法概算法主要是由头文件<algorithm><functional<numeric<algorithmSTL<functional>定义了一些模板类,用以函数对象常用遍历算遍历算法遍历容器元素@param遍历算法遍历容器元素@parambeg@paramend@param_callback函数回调或者函数对象@returnfor_each(iteratorbeg,iteratorend,transform算法transform@parambeg1源容器开始迭代器@paramend1源容器结束迭代器@parambeg2@param_cakkback@returntransform(iteratorbeg1,iteratorend1,iteratorbeg2,template<classtemplate<class_InIt,class_Fn1>voidfor_each(_InIt_First,_InIt_Last,_Fn1{for(;_First!=_Last;}voidprint01(intval){cout<<val<<"";}structprint001{voidoperator()(intval){cout<<val<<"";}voidvector<int>for(inti=0;i<10;i++){}for_each(v.begin(),v.end(),print01);cout<<endl;for_each(v.begin(),v.end(),print001());cout<<endl;}structprint02{mCount=}voidoperator()(intval){cout<<val<<"";}intvoidvector<int>for(inti=0;i<10;i++){}print02p=for_each(v.begin(),v.end(),print02());cout<<endl;cout<<p.mCount<<}structprint03:publicbinary_function<int,int,void>{voidoperator()(intval,intbindParam)const{cout<<val+bindParam<<"}voidvector<int>for(inti=0;i<10;i++){}for_each(v.begin(),v.end(),}//transform//transformtemplate<class_InIt,class_OutIt,class_Fn1>_OutIt_Transform(_InIt_First,_InIt_Last,_OutIt_Dest,_Fn1{for(;_First!=_Last;++_First,*_Dest=_Func(*_First);return(_Dest);}template<class_InIt1,class_InIt2,class_OutIt,class_Fn2>_OutIt_Transform(_InIt1_First1,_InIt1_Last1,_InIt2_First2,_OutIt_Fn2{for(;_First1!=_Last1;++_First1,++_First2,*_Dest=_Func(*_First1,*_First2);return(_Dest);}structintoperator()(intval){returnval+100;}structvoidoperator()(intval){cout<<val<<"";}voidvector<int>for(inti=0;i<10;i++){vSource.push_back(i+}vector<intvector<int>::iteratorit=transform(vSource.begin(),vSource.end(),vTarget.begin(),transformTest01());for_each(vTarget.begin(),vTarget.end(),print01());cout<<}structintoperator()(intv1,intv2){returnv1+v2;}voidvector<int>vSource1;vector<int>for(inti=0;i<10;i++){vSource1.push_back(i+1);}vector<inttransform(vSource1.begin(),vSource1.end(),vSource2.begin(),vTarget.begin(),for_each(vTarget.begin(),vTarget.end(),print01());cout<<}常用查找算find法找元@parambeg容器开始迭代器@paramend容器结束迭代器@paramvalue查找的元素@return回查找元素的位置find(iteratorbeg,iteratorend,find_if法条件查找@parambeg器开始迭代器@paramend器结束迭代@paramcallback调函数或者谓词(返回bool型的函数对象)@returnbool查找返回true否则falsefind_if(iteratorbeg,iteratorend,adjacent_find算法查找相邻重复元@parambeg器开始迭代@paramend器结束迭代@param_callback调函数或者谓词(返回bool型的函数对象)@return返回相邻元素的第一个位置的迭代器adjacent_find(iteratorbeg,iteratorend,binary_search法分查找法注意:在无序序列中不可用@parambeg容器开始迭代器@paramend容器结束迭代器@paramvalue查找的元素@returnbool找返回true则boolbinary_search(iteratorbeg,iteratorend,count法计元素出现次数@parambeg容器开始迭代器@paramend容器结束迭代器@paramvalue调函数或者谓词(返回bool型的函数对象)@returnint回元素个数count(iteratorcount(iteratorbeg,iteratorend,@parambeg容器开始迭代器@paramend容器结束迭代器@paramcallbackbool@returnint返回元素个数count_if(iteratorbeg,iteratorend,常用排序算merge算法容器元素合并, 到另一容器@parambeg1容器1始迭代器@paramend1容器1束迭代器@parambeg2容器2始迭代器@paramend2容器2束迭代器@paramdest目标容器开始迭代器merge(iteratorbeg1,iteratorend1,iteratorbeg2,iteratorend2,iteratorsort法器元素排@parambeg器1始迭代器@paramend器1束迭代@param_callback回调函数或者谓词(返回bool类型的函数对sort(iteratorbeg,iteratorend,sort算法对指定范围内的元素随机调整次@parambeg器开始迭代@paramend器结束迭代random_shuffle(iteratorbeg,iteratorreverse法转指定范围的元素

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论