




已阅读5页,还剩93页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十章泛型程序设计与C+标准模板库,清华大学郑莉,目录,10.1泛型程序设计及STL的结构10.2迭代器10.3容器的基本功能与分类10.4顺序容器10.5关联容器10.6函数对象10.7算法10.8综合实例对个人银行账户管理程序的改进10.9深度探索10.10小结,2,10.1.1泛型程序设计的基本概念,编写不依赖于具体数据类型的程序将算法从特定的数据结构中抽象出来,成为通用的C+的模板为泛型程序设计奠定了关键的基础几个术语概念(concept):用来界定具备一定功能的数据类型,如“支持voidinsertionSort(Sortablea,intn);事实上,很多STL的实现代码就是使用概念来命名模板参数的。,3,10.1泛型程序设计及STL的结构,10.1.2STL简介,标准模板库(StandardTemplateLibrary,简称STL)提供了一些非常常用的数据结构和算法STL程序实例(例10-1):,4,10.1泛型程序设计及STL的结构,/包含的头文件略去usingnamespacestd;intmain()constintN=5;vectors(N);for(inti=0;isi;transform(s.begin(),s.end(),ostream_iterator(cout,),negate();coutendl;return0;,容器,迭代器,函数对象,算法,10.1.2STL简介,transform算法的一种实现:templateOutputIteratortransform(InputIteratorfirst,InputIteratorlast,OutputIteratorresult,UnaryFunctionop)for(;first!=last;+first,+result)*result=op(*first);returnresult;,5,STL的组成部分,6,STL是泛型程序设计的一个范例容器(container)迭代器(iterator)算法(algorithms)函数对象(functionobject),10.1泛型程序设计及STL的结构10.1.2STL简介,10.2.1输入流迭代器和输出流迭代器,输入流迭代器istream_iterator以输入流(如cin)为参数构造可用*(p+)获得下一个输入的元素输出流迭代器ostream_iterator构造时需要提供输出流(如cout)可用(*p+)=x将x输出到输出流二者都属于适配器适配器是用来为已有对象提供新的接口的对象输入流适配器和输出流适配器为流对象提供了迭代器的接口,7,10.2迭代器,例10-2从标准输入读入几个实数,分别将它们的平方输出,/10_2.cpp#include#include#includeusingnamespacestd;/求平方的函数doublesquare(doublex)returnx*x;intmain()/从标准输入读入若干个实数,分别将它们的平方输出transform(istream_iterator(cin),istream_iterator(),ostream_iterator(cout,t),square);cout0)自增(+)操作后满足p1=p2区间包含p1,但不包含p2,11,10.2迭代器,例10-3综合运用几种迭代器的示例,/10_3.cpp#include#include#include#includeusingnamespacestd;/将来自输入迭代器p的n个T类型的数值排序,将结果通过输出迭代器result输出templatevoidmySort(InputIteratorfirst,InputIteratorlast,OutputIteratorresult)/通过输入迭代器p将输入数据存入向量容器s中vectors;for(;first!=last;+first)s.push_back(*first);sort(s.begin(),s.end();/对s进行排序,sort函数的参数必须是随机访问迭代器copy(s.begin(),s.end(),result);/将s序列通过输出迭代器输出,12,10.2迭代器10.2.3迭代器的区间,例10-3(续),intmain()/将s数组的内容排序后输出doublea5=1.2,2.4,0.8,3.3,3.2;mySort(a,a+5,ostream_iterator(cout,);cout(istream_iterator(cin),istream_iterator(),ostream_iterator(cout,);cout=begin()、end():获得容器首、尾迭代器clear():将容器清空empty():判断容器是否为空size():得到容器元素个数s1.swap(s2):将s1和s2两容器内容交换相关数据类型(S表示容器类型)S:iterator:指向容器元素的迭代器类型S:const_iterator:常迭代器类型,17,10.3容器的基本功能与分类,可逆容器、随机访问容器,可逆容器S:reverse_iterator:逆向迭代器类型S:const_reverse_iterator:逆向常迭代器类型rbegin():指向容器尾的逆向迭代器rend():指向容器首的逆向迭代器随机访问容器sn:获得容器s的第n个元素,18,10.3容器的基本功能与分类,10.4.1顺序容器的基本功能,顺序容器的接口赋值assign插入函数insert,push_front(只对list和deque),push_back删除函数erase,clear,pop_front(只对list和deque),pop_back其他顺序容器访问函数front,back改变大小resize,19,10.4顺序容器,例10-4顺序容器的基本操作,/10_4.cpp,包含的头文件略去/输出指定的整型顺序容器的元素templatevoidprintContainer(constchar*msg,constT,20,10.4顺序容器10.4.1顺序容器的基本功能,例10-4(续),printContainer(dequeatfirst,s);/用s容器的内容的逆序构造列表容器llistl(s.rbegin(),s.rend();printContainer(listatfirst,l);/将列表容器l的每相邻两个容器顺序颠倒list:iteratoriter=l.begin();while(iter!=l.end()intv=*iter;iter=l.erase(iter);l.insert(+iter,v);printContainer(listatlast,l);/用列表容器l的内容给s赋值,将s输出s.assign(l.begin(),l.end();printContainer(dequeatlast,s);return0;,21,10.4顺序容器10.4.1顺序容器的基本功能,例10-4(续),运行结果如下:0986432154dequeatfirst:4512346890listatfirst:0986432154listatlast:9068341245dequeatlast:9068341245,22,10.4顺序容器10.4.1顺序容器的基本功能,10.4.2三种顺序容器的特性向量(Vector),特点一个可以扩展的动态数组随机访问、在尾部插入或删除元素快在中间或头部插入或删除元素慢向量的容量容量(capacity):实际分配空间的大小s.capacity():返回当前容量s.reserve(n):若容量小于n,则对s进行扩展,使其容量至少为n,23,10.4顺序容器,双端队列(deque),特点在两端插入或删除元素快在中间插入或删除元素慢随机访问较快,但比向量容器慢,24,10.4顺序容器10.4.2三种顺序容器的特性,例10-5奇偶排序,先按照从大到小顺序输出奇数,再按照从小到大顺序输出偶数。,25,10.4顺序容器10.4.2三种顺序容器的特性,/头部分省略intmain()istream_iteratori1(cin),i2;/建立一对儿输入流迭代器vectors1(i1,i2);/通过输入流迭代器从标准输入流中输入数据sort(s1.begin(),s1.end();/将输入的整数排序deques2;/以下循环遍历s1for(vector:iteratoriter=s1.begin();iter!=s1.end();+iter)if(*iter%2=0)/偶数放到s2尾部s2.push_back(*iter);else/奇数放到s2首部s2.push_front(*iter);/将s2的结果输出copy(s2.begin(),s2.end(),ostream_iterator(cout,);coutendl;return0;,列表(list),特点在任意位置插入和删除元素都很快不支持随机访问接合(splice)操作s1.splice(p,s2,q1,q2):将s2中q1,q2)移动到s1中p所指向元素之前,26,10.4顺序容器10.4.2三种顺序容器的特性,例10-6列表容器的splice操作,/头部分省略intmain()stringnames1=Alice,Helen,Lucy,Susan;stringnames2=Bob,David,Levin,Mike;lists1(names1,names1+4);/用names1数组的内容构造列表s1lists2(names2,names2+4);/用names2数组的内容构造列表s2/将s1的第一个元素放到s2的最后s2.splice(s2.end(),s1,s1.begin();list:iteratoriter1=s1.begin();/iter1指向s1首advance(iter1,2);/iter1前进2个元素,它将指向s1第3个元素list:iteratoriter2=s2.begin();/iter2指向s2首+iter2;/iter2前进1个元素,它将指向s2第2个元素,27,10.4顺序容器10.4.2三种顺序容器的特性,例10-6(续),28,list:iteratoriter3=iter2;/用iter2初始化iter3advance(iter3,2);/iter3前进2个元素,它将指向s2第4个元素/将iter2,iter3)范围内的结点接到s1中iter1指向的结点前s1.splice(iter1,s2,iter2,iter3);/分别将s1和s2输出copy(s1.begin(),s1.end(),ostream_iterator(cout,);cout(cout,);coutstr;/从键盘输入一个字符串/将字符串的每个元素顺序压入栈中for(string:iteratoriter=str.begin();iter!=str.end();+iter)s.push(*iter);/将栈中的元素顺序弹出并输出while(!s.empty()couts.top();s.pop();coutv;if(v=0)break;/输入0表示结束pair:iterator,boolr=s.insert(v);/尝试将v插入if(!r.second)/如果v已存在,输出提示信息cout:iteratoriter1=s.begin();/得到第一个元素的迭代器set:iteratoriter2=s.end();/得到末尾的迭代器doublemedium=(*iter1+*(-iter2)/2;/得到最小和最大元素的中值/输出小于或等于中值的元素cout(cout,);cout=medium:;copy(s.lower_bound(medium),s.end(),ostream_iterator(cout,);coutname;/输入课程名称map:iteratoriter=courses.find(name);/查找课程if(iter=courses.end()/判断是否找到coutsecond;/累加学分courses.erase(iter);/将刚选过的课程从映射中删除n-;coutTotalcredit:sumc;/输入下一个字符if(isalpha(c)/判断是否是字母c=tolower(c);/将字母转换为小写sc+;/将该字母的出现频率加1while(c!=.);/碰到“.”则结束输入/输出每个字母出现次数for(map:iteratoriter=s.begin();iter!=s.end();+iter)coutfirstsecond;coutname;count=courses.count(name);if(count=0)coutrange=courses.equal_range(name);for(CourseIteriter=range.first;iter!=range.second;+iter)coutsecond;coutendl;return0;,49,10.5关联容器10.5.4多重集合与多重映射,例10-12(续),运行结果如下:JAVACannotfindthiscourse!OS3lesson(s)perweek:1-24-15-5,10.6.1函数对象,函数对象一个行为类似函数的对象可以没有参数,也可以带有若干参数其功能是获取一个值,或者改变操作的状态。例普通函数就是函数对象重载了“()”运算符的类的实例是函数对象,50,10.6函数对象,函数对象概念图,51,10.6函数对象10.6.1函数对象,函数对象(Function),一元函数对象(UnaryFunction),二元函数对象(BinaryFunction),产生器(Generator),一元谓词(UnaryPredicate),二元谓词(BinaryPredicate),例10-13、例10-14,使用两种方式定义表示乘法的函数对象通过定义普通函数(例10-13)通过重载类的“()”运算符(例10-14)用到以下算法:templateTypeaccumulate(InputIteratorfirst,InputIteratorlast,Typeval,BinaryFunctionbinaryOp);对first,last)区间内的数据进行累“加”,binaryOp为用二元函数对象表示的“加”运算符,val为累“加”的初值,52,10.6函数对象10.6.1函数对象,#include#include/包含数值算法头文件usingnamespacestd;/定义一个普通函数intmult(intx,inty)returnx*y;intmain()inta=1,2,3,4,5;constintN=sizeof(a)/sizeof(int);coutTheresultbymultiplingallelementsinaisaccumulate(a,a+N,1,mult)endl;return0;,53,10.6函数对象10.6.1函数对象,例10-13(续),/10_14.cpp#include#include/包含数值算法头文件usingnamespacestd;classMultClass/定义MultClass类public:intoperator()(intx,inty)constreturnx*y;/重载操作符operator();intmain()inta=1,2,3,4,5;constintN=sizeof(a)/sizeof(int);coutTheresultbymultiplingallelementsinaisaccumulate(a,a+N,1,MultClass()/将类multclass传递给通用算法endl;return0;,54,10.6函数对象10.6.1函数对象,例10-14(续),STL提供的函数对象,用于算术运算的函数对象:一元函数对象:negate二元函数对象:plus、minus、multiplies、divides、modulus用于关系运算、逻辑运算的函数对象一元谓词:logical_not二元谓词:equal_to、not_equal_to、greater、less、greater_equal、less_equal、logical_and、logical_or,55,10.6函数对象10.6.1函数对象,例10-15利用STL标准函数对象,/10_15.cpp#include#include/包含数值算法头文件#include/包含标准函数对象头文件usingnamespacestd;intmain()inta=1,2,3,4,5;constintN=sizeof(a)/sizeof(int);cout()endl;/将标准函数对象传递给通用算法return0;,56,10.6函数对象10.6.1函数对象,例10-16利用STL中的二元谓词函数对象,/10_16.cpp,省略头部分intmain()intintArr=30,90,10,40,70,50,20,80;constintN=sizeof(intArr)/sizeof(int);vectora(intArr,intArr+N);cout(cout,t);cout();cout(cout,t);coutendl;return0;,57,10.6函数对象10.6.1函数对象,10.6.2函数适配器,绑定适配器将n元函数对象的指定参数绑定为一个常数,得到n-1元函数对象:bind1st、bind2nd组合适配器将指定谓词的结果取反:not1、not2指针函数适配器对一般函数指针使用,使之能够作为其它函数适配器的输入:ptr_fun成员函数适配器对成员函数指针使用,把n元成员函数适配为n+1元函数对象,该函数对象的第一个参数为调用该成员函数时的目的对象:ptr_fun、ptr_fun_ref,58,10.6函数对象,例10-17bind2nd产生binder2nd函数适配器实例,/10_17.cpp#include#include#include#includeusingnamespacestd;intmain()intintArr=30,90,10,40,70,50,20,80;constintN=sizeof(intArr)/sizeof(int);vectora(intArr,intArr+N);vector:iteratorp=find_if(a.begin(),a.end(),bind2nd(greater(),40);if(p=a.end()coutnoelementgreaterthan40endl;elsecoutfirstelementgreaterthan40is:*py;intmain()intintArr=30,90,10,40,70,50,20,80;constintN=sizeof(intArr)/sizeof(int);vectora(intArr,intArr+N);vector:iteratorp;p=find_if(a.begin(),a.end(),bind2nd(ptr_fun(g),40);if(p=a.end()coutnoelementgreaterthan40endl;elsecoutfirstelementgreaterthan40is:*pendl;,60,10.6函数对象10.6.2函数适配器,61,10.6函数对象10.6.2函数适配器,p=find_if(a.begin(),a.end(),not1(bind2nd(greater(),15);if(p=a.end()cout(),15);if(p=a.end()coutnoelementisnotgreaterthan15endl;elsecoutfirstelementthatisnotgreaterthan15is:*pid=id;voiddisplay()constcoutpcars;vectorcars;,62,10.6函数对象10.6.2函数适配器,63,10.6函数对象10.6.2函数适配器,for(inti=0;i5;i+)pcars.push_back(newCar(i);for(inti=5;i10;i+)cars.push_back(Car(i);coutelementsinpcars:endl;for_each(pcars.begin(),pcars.end(),std:mem_fun(,例10-19(续),10.7.1STL算法基础,STL算法本身是一种函数模版通过迭代器获得输入数据通过函数对象对数据进行处理通过迭代器将结果输出STL算法是通用的,独立于具体的数据类型、容器类型STL算法分类不可变序列算法可变序列算法排序和搜索算法数值算法,64,10.7算法,10.7.2不可变序列算法,不可变序列算法不直接修改所操作的容器内容的算法用于查找指定元素、比较两个序列是否相等、对元素进行计数等例:templateInputIteratorfind_if(InputIteratorfirst,InputIteratorlast,UnaryPredicatepred);用于查找first,last)区间内pred(x)为真的首个元素,65,10.7算法,例10-20不可变序列算法应用实例,/10_20.cpp,头部分省略.intmain()intiarray=0,1,2,3,4,5,6,6,6,7,8;vectorivector(iarray,iarray+sizeof(iarray)/sizeof(int);intiarray1=6,6;vectorivector1(iarray1,iarray1+sizeof(iarray1)/sizeof(int);intiarray2=5,6;vectorivector2(iarray2,iarray2+sizeof(iarray2)/sizeof(int);intiarray3=0,1,2,3,4,5,7,7,7,9,7;vectorivector3(iarray3,iarray3+sizeof(iarray3)/sizeof(int);/找出ivector之中相邻元素值相等的第一个元素cout(),7)result=mismatch(ivector.begin(),ivector.end(),ivector3.begin();coutresult.first-ivector.begin()endl;return0;,67,10.7算法10.7.2不可变序列算法,例10-20(续),10.7.3可变序列算法,可变序列算法可以修改它们所操作的容器对象包括对序列进行复制、删除、替换、倒序、旋转、交换、变换、分割、去重、填充、洗牌的算法及生成一个序列的算法例:templateInputIteratorfind_if(ForwardIteratorfirst,ForwardIteratorlast,constT把first,last)区间内的元素全部改写为x,68,10.7算法,例10-21,以可变序列算法对数据序列进行复制,生成,删除,替换,倒序,旋转等可变性操作,69,10.7算法10.7.3可变序列算法,/10_21.cpp,头部分省略classevenByTwoprivate:intx;public:evenByTwo():x(0)intoperator()()returnx+=2;intmain()intiarray1=0,1,2,3,4,4,5,5,6,6,6,6,6,7,8;intiarray2=0,1,2,3,4,5,6,6,6,7,8;vectorivector1(iarray1,iarray1+sizeof(iarray1)/sizeof(int);vectorivector2(iarray2,iarray2+sizeof(iarray2)/sizeof(int);vectorivector3(2);ostream_iteratoroutput(cout,);/定义流迭代器用于输出数据/迭代遍历ivector3区间,每个元素填上-1fill(ivector3.begin(),ivector3.end(),-1);copy(ivector3.begin(),ivector3.end(),output);/使用copy进行输出coutendl;/迭代遍历ivector3区间,对每一个元素进行evenByTwo操作generate(ivector3.begin(),ivector3.end(),evenByTwo();copy(ivector3.begin(),ivector3.end(),output);coutendl;,70,10.7算法10.7.3可变序列算法,例10-21(续),/将删除元素6后的ivector2序列置于另一个容器ivector4之中vectorivector4;remove_copy(ivector2.begin(),ivector2.end(),back_inserter(ivector4),6);copy(ivector4.begin(),ivector4.end(),output);cout(),6),ivector2.end();copy(ivector2.begin(),ivector2.end(),output);coutendl;/将所有的元素值6,改为元素值3replace(ivector2.begin(),ivector2.end(),6,3);copy(ivector2.begin(),ivector2.end(),output);coutendl;/逆向重排每一个元素reverse(ivector2.begin(),ivector2.end();copy(ivector2.begin(),ivector2.end(),output);coutendl;/旋转(互换元素)first,middle),和middle,end),结果直接输出rotate_copy(ivector2.begin(),ivector2.begin()+3,ivector2.end(),output);coutendl;return0;,71,10.7算法10.7.3可变序列算法,例10-21(续),例10-21(续),运行结果:-1-1240123457866678333788733333873,72,10.7算法10.7.3可变序列算法,10.7.4排序和搜索算法,排序和搜索算法对序列进行排序对两有序序列进行合并对有序序列进行搜索有序序列的集合操作堆算法例:templatevoidsort(RandomAccessIteratorfirst,RandomAccessIteratorlast,UnaryPredicatecomp);以函数对象comp为“”,对first,last)区间内的数据进行排序,73,10.7算法,例10-22排序与搜索算法示例,/10_22.cpp,头部分省略intmain()intiarray=26,17,15,22,23,33,32,40;vectorivector(iarray,iarray+sizeof(iarray)/sizeof(int);/查找并输出第一个最大值元素及其位置vector:iteratorp=max_element(ivector.begin(),ivector.end();intn=p-ivector.begin();coutivector1(5);/局部排序并复制到别处partial_sort_copy(ivector.begin(),ivector.end(),ivector1.begin(),ivector1.end();copy(ivector1.begin(),ivector1.end(),ostream_iterator(cout,);cout(cout,);coutendl;,74,10.7算法10.7.4排序和搜索算法,/返回小于等于24和大于等于24的元素的位置coutivector2(13);merge(ivector.begin(),ivector.end(),ivector1.begin(),ivector1.end(),ivector2.begin();copy(ivector2.begin(),ivector2.end(),ostream_iterator(cout,);cout(cout,);cout(cout,);coutendl;,75,10.7算法10.7.4排序和搜索算法,例10-22(续),/合并两个有序序列,然后就地替换intiarray3=1,3,5,7,2,4,6,8;vectorivector3(iarray3,iarray3+sizeof(iarray3)/sizeof(int);inplace_merge(ivector3.begin(),ivector3.begin()+4,ivector3.end();copy(ivector3.begin(),ivector3.end(),ostream_iterator(cout,);coutivector4(iarray4,iarray4+sizeof(iarray4)/sizeof(int);coutlexicographical_compare(ivector3.begin(),ivector3.end(),ivector4.begin(),ivector4.end()endl;return0;,76,10.7算法10.7.4排序和搜索算法,例10-22(续),10.7.5数值算法,数值算法求序列中元素的“和”、部分“和”、相邻元素的“差”或两序列的内积求“和”的“+”、求“差”的“-”以及求内积的“+”和“”都可由函数对象指定例:templateOutputIteratorpartial_sum(InputIteratorfirst,InputIteratorlast,OutputIteratorresult,BinaryFunctionop);对first,last)内的元素求部分“和”(所谓部分“和”,是一个长度与输入序列相同的序列,其第n项为输入序列前n个元素的“和”),以函数对象op为“+”运算符,结果通过result输出,返回的迭代器指向输出序列最后一个元素的下一个元素,77,10.7算法,例10-23数值算法示例,/10_23.cpp,头部分省略intmain()intiarray=1,2,3,4,5;vectorivector(iarray,iarray+sizeof(iarray)/sizeof(int);/元素的累计cout(cout,);cout(cout,);coutyearc1monthc2day;returnDate(year,month,day);/accumulator.h的内容与例8-8完全相同,不再重复给出/account.h#ifndef_ACCOUNT_H_#define_ACCOUNT_H_#includedate.h#includeaccumulator.h#include#includeclassAccount;/前置声明classAccountRecord/账目记录private:Datedate;/日期constAccount*account;/账户doubleamount;/金额doublebalance;/余额std:stringdesc;/描述public:/构造函数AccountRecord(constDate,81,10.8综合实例对个人银行账户管理程序的改进,例10-24(续),/定义用来存储账目记录的多重映射类型typedefstd:multimapRecordMap;classAccount/账户类private:std:stringid;/帐号doublebalance;/余额staticdoubletotal;/所有账户的总金额staticRecordMaprecordMap;/账目记录protected:/供派生类调用的构造函数,id为账户Account(constDate#endif/_ACCOUNT_H_,82,10.8综合实例对个人银行账户管理程序的改进,例10-24(续),/SavingsAccount和CreditAccount两个类的定义与例7-10完全相同,不再重复给出/account.cpp#includeaccount.h#include#include#includeusingnamespacestd;usingnamespacestd:rel_ops;/AccountRecord类的实现AccountRecord:AccountRecord(constDate,83,10.8综合实例对个人银行账户管理程序的改进,例10-24(续),/10_24.cpp#includeaccount.h#include#include#includeusingnamespacestd;structdeletertemplatevoidoperator()(T*p)deletep;intmain()Datedate(2008,11,1);/起始日期vectoraccounts;/创建账户数组,元素个数为0cout;chartype;intindex,day;doubleamount,credit,rate,fee;stringid,desc;Account*account;Datedate1,date2;cincmd;,84,10.8综合实例对个人银行账户管理程序的改进,例10-24(续),switch(cmd)casea:/增加账户cintypeid;if(type=s)cinrate;account=newSavingsAccount(date,id,rate);elsecincreditratefee;account=newCreditAccount(date,id,credit,rate,fee);accounts.push_back(account);break;cased:/存入现金cinindexamount;getline(cin,desc);accountsindex-deposit(date,amount,desc);break;casew:/取出现金cinindexamount;getline(cin,desc);accountsindex-withdraw(date,amount,desc);break;cases:/查询各账户信息for(size_ti=0;ishow();coutday;if(daydate.getMaxDay()cout:iteratoriter=accounts.begin();iter!=accounts.end();+iter)(*iter)-settle(date);break;caseq:/查询一段时间内的账目date1=Date:read();date2=Date:read();Account:query(date1,date2);break;while(cmd!=e);for_each(accounts.begin(),accounts.end(),deleter();return0;,86,10.8综合实例对个人银行账户管理程序的改进,例10-24(续),例10-24(续),运行结果如下:.(前面的输入和输出与例9-16给出的完全相同,不再重复)2009-1-1Total:20482.9commandq2008-11-012008-11-302008-11-5#S375521750005000salary2008-11-15#C5392394-2000-2000buyacell2008-11-25#023423421000010000sellstock03232009-1-1Total:20482.9commandq2008-12-012008-12-312008-12-1#C5392394-16-2016interest2008-12-1#C539239420160repaythecredit2008-12-5#S3755217550010500salary2009-1-1Total:20482.9commande,87,10.8综合实例对个人银行账户管理程序的改进,10.9.1swap,swap的一种通用实现templatevoidswap(T当T为vector等数据类型时,这种实现有什么问题?以上函数中,需要进行多次深拷贝执行交换操作,有必要深拷贝吗?,88,10.9深度探索,swap高效的执行方式,89,1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 合伙经营协议合同
- 商业房房屋买卖合同
- 购销合同奶粉
- 承包合同转让协议
- 合同违约民事起诉状
- 资金投资合同协议
- 佛山二手房三方协议合同
- 监控工程转包合同协议书
- 车行购车协议合同
- 供货合同协议框架协议
- 大小便观察与护理
- 2025年-重庆市安全员-A证考试题库附答案
- 湖北省孝感市高新区2023-2024学年七年级下学期数学期中考试试卷(含答案)
- 8.2 诚信经营 依法纳税课件-高中政治统编版选择性必修二法律与生活
- 领导带班及24小时值班制度
- 具身智能机器人扩散策略Diffusion Policy环境安装与运行
- 湖北省武汉市2024-2025学年高三2月调研考试英语试题含答案
- 小学英语国测试卷
- 安徽省涡阳县高炉小学-春暖花已开一起向未来-二年级下册开学家长会【课件】
- 核电站设备采购合同
- 肿瘤患者的血栓预防及护理
评论
0/150
提交评论