标准模板类库STL.ppt_第1页
标准模板类库STL.ppt_第2页
标准模板类库STL.ppt_第3页
标准模板类库STL.ppt_第4页
标准模板类库STL.ppt_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

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

文档简介

,11.1 基本数据结构知识 11.2泛型程序设计与标准模板类库STL简介 11.3 向量 11.4 链表类的使用 11.5 双端队列 11.6 栈与队列 11.7 集合,第 11 章 标准模板类库STL,【 11.1 基本数据结构知识】,向队尾添加元素称为“入队”,删除队头元素称为“出队”。 队列中元素的添加和删除操作具有“先进先出”(FIFO)的特性。,图 队列的逻辑结构示意图,4,11.2.1泛型程序设计,将程序写得尽可能通用 将算法从特定的数据结构中抽象出来,成为通用的 C+的模板为泛型程序设计奠定了关键的基础 STL是泛型程序设计的一个范例 容器(container) 迭代器(iterator) 算法(algorithms) 函数对象(function object),【 11.2泛型程序设计与标准模板类库STL简介】,5,命名空间(Namespace),一个命名空间将不同的标识符集合在一个命名作用域(named scope)内 为了解决命名冲突 例如,声明一个命名空间NS: namspace NS class File; void Fun (); 则引用标识符的方式如下, NS: File obj; NS: Fun (); 没有声明命名空间的标识符都处于无名的命名空间中,概念和术语,6,命名空间(Namespace),可以用using来指定命名空间 例如,经过以下声明: using NS:File; 在当前作用域中就可以直接引用File using namespace std; 命名空间std中所有标识符都可直接引用 在新的C+标准程序库中,所有标识符都声明在命名空间std中,头文件都不使用扩展名,概念和术语,7,容器,容器类是容纳、包含一组元素或元素集合的对象。 异类容器类与同类容器类 顺序容器与关联容器 七种基本容器: 向量(vector)、双端队列(deque)、列表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap),概念和术语,8,容器的接口,通用容器运算符 =,!=,=,=,= 方法(函数) 迭代方法 begin(),end(),rbegin(),rend() 访问方法 size(),max_size(),swap(),empty(),9,适配器,适配器是一种接口类 为已有的类提供新的接口。 目的是简化、约束、使之安全、隐藏或者改变被修改类提供的服务集合。 三种类型的适配器: 容器适配器 用来扩展7种基本容器,它们和顺序容器相结合构成栈、队列和优先队列容器 迭代器适配器 函数对象适配器。,概念和术语,10,迭代器,迭代器是面向对象版本的指针,它们提供了访问容器、序列中每个元素的方法。,概念和术语,11,算法,C+标准模板库中包括70多个算法 其中包括查找算法,排序算法,消除算法,记数算法,比较算法,变换算法,置换算法和容器管理等等。 这些算法的一个最重要的特性就是它们的统一性,并且可以广泛用于不同的对象和内置的数据类型。,概念和术语,12,函数对象,一个行为类似函数的对象,它可以不需参数,也可以带有若干参数,其功能是获取一个值,或者改变操作的状态。 任何普通的函数和任何重载了调用运算符operator()的类的对象都满足函数对象的特征 STL中也定义了一些标准的函数对象,如果以功能划分,可以分为算术运算、关系运算、逻辑运算三大类。为了调用这些标准函数对象,需要包含头文件。,STL中的群体类是基于模板的,它既包含线性群体类,也包含非线性群体类,其中主要有: vector(向量) list(链表) stack(栈) queue(队列) deque(双端队列) set(集合) map(映射),【 11.2.2标准模板类库STL简介】,排序(sort、merge) 查找(find、search) 比较(equal) 集合(includes、setunion、setdifference) 计算(accumulate、partialsum) 统计(max、min) 管理(swap、fill、replace、copy、unique、rotate、reverse) 堆操作(makeheap、pushheap、popheap、sortheap),STL的主要算法有:,向量模板类中较为重要的成员函数有begin、end、insert、erase 、 operator等。,iterator insert(iterator it, const T /移走first到last之间的对象,【 11.3 向量】,template OutIt copy(InIt first, InIt last, OutIt x); /该函 /数将从first到last之间的对象依次赋给位置x的对象, /同时x+。在本例中是赋给标准输出流。 template T accumulate(InIt first, InIt last, T val); /在first /和last之间依次取得对象值,每次该值与val的和替代原val值,返回val。template T accumulate(InIt first, InIt last, T val, Pred pr); /在first和last之间依次取得对象值,每次该值与val进行pr运算后得到的 /新值(在例中用到multiplies,进行乘法运算)替代原val值,返回val。,例 11-1,vector nMyVector1, /整型向量 nMyVector2; /该向量类型的迭代子 vector:iterator nItBegin,nItEnd; /该向量类型的输出流迭代子 ostreamiterator nOutput(cout, ); /对向量类型对象中的数据进行顺序赋值 for(int i=1;i=10;i+) nMyVector1.pushback(i); /将该向量类型对象中的数据输出到标准输出流,显示出来。 copy(nMyVector1.begin(),nMyVector1.end(),nOutput); cout endl; /该向量类型的迭代子被赋值 nItBegin =nMyVector1.begin(); nItEnd =nMyVector1.end();,(续),/用insert函数实现两个向量类型对象成员数据的复制 nMyVector2.insert(nMyVector2.begin(),nMyVector1.begin(),nMyVector1.end(); for(i=0;inMyVector2.size();i+) coutnMyVector2i ; coutendl; /用迭代子输出该向量类型对象的数据 while(nItBegin!=nItEnd) cout*nItBegin ; nItBegin+; cout endl; /用标准算法得到整型向量对象中所有数据的和 cout The sum of nMyVector1i is: accumulate(nMyVector1.begin(),nMyVector1.end(),0.0f) endl; nItBegin=nMyVector1.begin(); nItEnd =nMyVector1.end();,(续),/用一个已经存在的向量对象初始化另一个向量对象 vector nMyVector3(nItBegin,nItEnd); vector nMyVector4(nMyVector3); /输出两个新的向量对象 copy(nMyVector3.begin(),nMyVector3.end(),nOutput); cout endl; copy(nMyVector4.begin(),nMyVector4.end(),nOutput); cout endl; ,(续),例 11-2,int x; int y; public: /声明对外接口 Point(int xx=0,int yy=0) /带默认形参值的构造函数 x=xx;y=yy; void display() /显示函数 cout=、=。 bool operator (const Point bool Point:operator =(const Point &point2) const if(x=point2.getx()&(y=point2.gety(),(续),return true ; else return false ; bool Point:operator nMyVector1, /整型向量 nMyVector2; vector dblMyVector1, /双精度型向量 dblMyVector2; vector cMyVector1, /字符型向量 cMyVector2; vector strMyVector1, /字符串型向量 strMyVector2; vector ptMyVector1, /Point型向量,(续),ptMyVector2; /针对不同向量类型的迭代子 vector:iterator nItBegin,nItEnd; vector:iterator dblItBegin,dblItEnd; vector:iterator cItBegin,cItEnd; vector:iterator strItBegin,strItEnd; vector:iterator ptItBegin,ptItEnd; /针对不同向量类型的输出流迭代子 ostreamiterator nOutput(cout, ); ostreamiterator dblOutput(cout, ); ostreamiterator cOutput(cout, ); ostreamiterator strOutput(cout, ); /向各种向量类型对象中写入数据 for(int i=1;i=10;i+) nMyVector1.pushback(i); dblMyVector1.pushback(i/10.0); cMyVector1.pushback(A+i);,(续),Point *point=new Point(i,i); ptMyVector1.pushback(*point); strMyVector1.pushback(I ); strMyVector1.pushback(Like ); strMyVector1.pushback(C+!); /将不同向量类型对象中的数据输出到标准输出流,显示出来。 copy(nMyVector1.begin(),nMyVector1.end(),nOutput); cout endl; copy(dblMyVector1.begin(),dblMyVector1.end(),dblOutput); cout endl; copy(cMyVector1.begin(),cMyVector1.end(),cOutput); cout endl; copy(strMyVector1.begin(),strMyVector1.end(),strOutput); cout endl; /各个向量类型的迭代子被赋值 nItBegin =nMyVector1.begin(); dblItBegin=dblMyVector1.begin();,(续),cItBegin =cMyVector1.begin(); strItBegin=strMyVector1.begin(); ptItBegin =ptMyVector1.begin(); nItEnd =nMyVector1.end(); dblItEnd=dblMyVector1.end(); cItEnd =cMyVector1.end(); strItEnd=strMyVector1.end(); ptItEnd =ptMyVector1.end(); /用insert函数实现两个向量类型对象成员数据的复制 nMyVector2.insert(nMyVector2.begin(),nMyVector1.begin(),nMyVector1.end(); for(i=0;inMyVector2.size();i+) coutnMyVector2i ; coutendl; dblMyVector2.insert(dblMyVector2.begin(),dblMyVector1.begin(),dblMyVector1 .end(); for(i=0;idblMyVector2.size();i+) ,(续),coutdblMyVector2i ; coutendl; cMyVector2.insert(cMyVector2.begin(),cMyVector1.begin(),cMyVector1.end(); for(i=0;icMyVector2.size();i+) coutcMyVector2i ; coutendl; strMyVector2.insert(strMyVector2.begin(),strMyVector1.begin(),strMyVector1 .end(); for(i=0;istrMyVector2.size();i+) coutstrMyVector2i ; coutendl; ptMyVector2.insert(ptMyVector2.begin(),ptMyVector1.begin(),ptMyVector1.end (); for(i=0;iptMyVector2.size();i+) ,(续),int static count=0; if(count=5) count=0; coutendl; ptMyVector2i.display(); count+; coutendl; /用迭代子输出不同向量类型对象的数据 while(nItBegin!=nItEnd) cout*nItBegin ; nItBegin+; cout endl; while(dblItBegin!=dblItEnd) ,(续),cout*dblItBegin ; dblItBegin+=2; cout endl; while(cItEnd!=cItBegin) cout*(-cItEnd) ; cout endl; while(strItBegin!=strItEnd) cout*strItBegin ; strItBegin+; cout endl; while(ptItBegin!=ptItEnd) int static count=0; if(count=5),(续), count=0; coutdisplay(); ptItBegin+; count+; cout () endl;,(续),/从字符型向量对象中弹出数据 for(i=0;i5;i+) cItEnd=cMyVector1.end(); coutThe Element will be pop is: *(-cItEnd)endl; cMyVector1.popback(); cItEnd=cMyVector1.end(); cItBegin=cMyVector1.begin(); /输出弹出数据后的字符型向量对象的数据 while(cItBegin!=cItEnd) cout*cItBegin ; cItBegin+; cout endl; nItBegin=nMyVector1.begin(); nItEnd =nMyVector1.end();,(续),/用一个已经存在的向量对象初始化另一个向量对象 vector nMyVector3(nItBegin,nItEnd); vector nMyVector4(nMyVector3); /输出两个新的向量对象 copy(nMyVector3.begin(),nMyVector3.end(),nOutput); cout endl; copy(nMyVector4.begin(),nMyVector4.end(),nOutput); cout endl; /源程序结束,(续),(续),例 11-3,/EXAMPLE11_3.CPP /源程序开始 #pragma warning (disable : 4786) /防止一个编译警告的出现 #include #include #include #include #include #include #include using namespace std; /声明使用std名称空间 (续),【 11.4 链表类的使用】,例 11-3,bool Point:operator =(const Point ,(续),list cMyList1, /字符型list cMyList2; list strMyList1, /字符串型list strMyList2; list ptMyList1, /Point型list ptMyList2 /针对不同list类型的迭代子 list:iterator nItBegin1,nItEnd1, nItBegin2,nItEnd2; list:iterator dblItBegin1,dblItEnd1, dblItBegin2,dblItEnd2; list:iterator cItBegin1,cItEnd1, cItBegin2,cItEnd2; list:iterator strItBegin1,strItEnd1, strItBegin2,strItEnd2; list:iterator ptItBegin1,ptItEnd1, ptItBegin2,ptItEnd2; /针对不同list类型的输出流迭代子 ostreamiterator nOutput(cout, );,(续),ostreamiterator dblOutput(cout, ); ostreamiterator cOutput(cout, ); ostreamiterator strOutput(cout, ); /对list类型对象中的数据赋值 for(int i=1;i=10;i+) nMyList1.pushback(i); dblMyList1.pushback(i/10.0); cMyList1.pushback(A+i); Point *point=new Point(i,i); ptMyList1.pushback(*point); strMyList1.pushback(I ); strMyList1.pushback(Like ); strMyList1.pushback(C+!); /将不同list类型对象中的数据输出到标准输出流,显示出来。 copy(nMyList1.begin(),nMyList1.end(),nOutput); cout endl;,(续),copy(dblMyList1.begin(),dblMyList1.end(),dblOutput); cout endl; copy(cMyList1.begin(),cMyList1.end(),cOutput); cout endl; copy(strMyList1.begin(),strMyList1.end(),strOutput); cout endl; /各个list类型的迭代子被赋值 nItBegin1 =nMyList1.begin(); dblItBegin1=dblMyList1.begin(); cItBegin1 =cMyList1.begin(); strItBegin1=strMyList1.begin(); ptItBegin1 =ptMyList1.begin(); nItEnd1 =nMyList1.end(); dblItEnd1=dblMyList1.end(); cItEnd1 =cMyList1.end(); strItEnd1=strMyList1.end(); ptItEnd1 =ptMyList1.end(); /用insert函数实现两个list类型对象成员数据的复制 nMyList2.insert(nMyList2.begin(),nMyList1.begin(),nMyList1.end(); dblMyList2.insert(dblMyList2.begin(),dblMyList1.begin(),dblMyList1.end();,(续),cMyList2.insert(cMyList2.begin(),cMyList1.begin(),cMyList1.end(); strMyList2.insert(strMyList2.begin(),strMyList1.begin(),strMyList1.end(); ptMyList2.insert(ptMyList2.begin(),ptMyList1.begin(),ptMyList1.end(); /各个list类型的迭代子被赋值 nItBegin2 =nMyList2.begin(); dblItBegin2=dblMyList2.begin(); cItBegin2 =cMyList2.begin(); strItBegin2=strMyList2.begin(); ptItBegin2 =ptMyList2.begin(); nItEnd2 =nMyList2.end(); dblItEnd2=dblMyList2.end(); cItEnd2 =cMyList2.end(); strItEnd2=strMyList2.end(); ptItEnd2 =ptMyList2.end(); /用迭代子输出不同list类型对象的数据,对于list类型不能对迭代子使用+=/-=等 /运算符也不能使用进行直接存取,(续),while(nItBegin1!=nItEnd1) /输出nMyList1 cout*nItBegin1 ; nItBegin1+; cout endl; while(dblItBegin1!=dblItEnd1) /输出dblMyList1 cout*dblItBegin1 ; dblItBegin1+; cout endl; while(cItEnd1!=cItBegin1) /输出cMyList1 cout*(-cItEnd1) ; cout endl; while(strItBegin1!=strItEnd1) /输出strMyList1,(续), coutdisplay(); ptItBegin1+; count+; cout endl; /分别输出用insert函数得到的新对象 while(nItBegin2!=nItEnd2) /输出nMyList2,(续), cout*nItBegin2 ; nItBegin2+; cout endl; while(dblItBegin2!=dblItEnd2) /输出dblMyLIst2 cout*dblItBegin2 ; dblItBegin2+; cout endl; while(cItEnd2!=cItBegin2) /输出cMyList2 0 cout*(-cItEnd2) ; cout endl; while(strItBegin2!=strItEnd2) /输出strMyList2 ,(续),coutdisplay(); ptItBegin2+; count+; cout endl; /从字符型list对象中弹出数据 for(i=0;i5;i+) ,(续),cItEnd1=cMyList1.end(); cout nMyList3(nItBegin1,nItEnd1); list nMyList4(nMyList3);,(续),/输出两个新的list对象 copy(nMyList3.begin(),nMyList3.end(),nOutput); cout endl; copy(nMyList4.begin(),nMyList4.end(),nOutput); cout endl; /源程序结束,(续),(续),/EXAMPLE11_4.CPP /源程序开始 #pragma warning (disable : 4786) /防止一个编译警告的出现 #include #include #include #include #include #include #include using namespace std; /声明使用std名称空间,例 11-4,【 11.5 双端队列】,例 11-4,bool Point:operator =(const Point ,(续),deque strMyDeque1, /字符串型双端队列 strMyDeque2; deque ptMyDeque1, /Point型双端队列 ptMyDeque2; /针对不同双端队列类型的迭代子 deque:iterator nItBegin,nItEnd; deque:iterator dblItBegin,dblItEnd; deque:iterator cItBegin,cItEnd; deque:iterator strItBegin,strItEnd; deque:iterator ptItBegin,ptItEnd; /针对不同双端队列类型的输出流迭代子 ostreamiterator nOutput(cout, ); ostreamiterator dblOutput(cout, ); ostreamiterator cOutput(cout, ); ostreamiterator strOutput(cout, ); /得到各种双端队列类型对象中的数据 for(int i=1;i=10;i+) nMyDeque1.pushback(i);,(续),dblMyDeque1.pushfront(i/10.0); cMyDeque1.pushback(A+i); Point *point=new Point(i,i); ptMyDeque1.pushback(*point); strMyDeque1.pushback(I ); strMyDeque1.pushback(Like ); strMyDeque1.pushback(C+!); /将不同双端队列类型对象中的数据输出到标准输出流,显示出来 copy(nMyDeque1.begin(),nMyDeque1.end(),nOutput); cout endl; copy(dblMyDeque1.begin(),dblMyDeque1.end(),dblOutput); cout endl; copy(cMyDeque1.begin(),cMyDeque1.end(),cOutput); cout endl; copy(strMyDeque1.begin(),strMyDeque1.end(),strOutput); cout endl;,(续),/各个双端队列类型的迭代子被赋值 nItBegin =nMyDeque1.begin(); dblItBegin=dblMyDeque1.begin(); cItBegin =cMyDeque1.begin(); strItBegin=strMyDeque1.begin(); ptItBegin =ptMyDeque1.begin(); nItEnd =nMyDeque1.end(); dblItEnd=dblMyDeque1.end(); cItEnd =cMyDeque1.end(); strItEnd=strMyDeque1.end(); ptItEnd =ptMyDeque1.end(); /用insert函数实现两个双端队列类型对象成员数据的复制 nMyDeque2.insert(nMyDeque2.begin(),nMyDeque1.begin(),nMyDeque1.end(); for(i=0;inMyDeque2.size();i+) coutnMyDeque2i ; coutendl;,(续),dblMyDeque2.insert(dblMyDeque2.begin(),dblMyDeque1.begin(),dblMyDequ e1.end(); for(i=0;idblMyDeque2.size();i+) coutdblMyDeque2i ; coutendl; cMyDeque2.insert(cMyDeque2.begin(),cMyDeque1.begin(),cMyDeque1.end(); for(i=0;icMyDeque2.size();i+) coutcMyDeque2i ; coutendl; strMyDeque2.insert(strMyDeque2.begin(),strMyDeque1.begin(),strMyDequ e1.end(); for(i=0;istrMyDeque2.size();i+) coutstrMyDeque2i ; coutendl;,(续),ptMyDeque2.insert(ptMyDeque2.begin(),ptMyDeque1.begin(),ptMyDeque1.end(); for(i=0;iptMyDeque2.size();i+) int static count=0; if(count=5) count=0; coutendl; ptMyDeque2i.display(); count+; coutendl; /用迭代子输出不同双端队列类型对象的数据 while(nItBegin!=nItEnd) cout*nItBegin ; nItBegin+; cout endl;,(续),while(dblItBegin!=dblItEnd) cout*dblItBegin ; dblItBegin+=2; cout endl; while(cItEnd!=cItBegin) cout*(-cItEnd) ; cout endl; while(strItBegin!=strItEnd) cout*strItBegin ; strItBegin+; cout endl; while(ptItBegin!=ptItEnd) ,(续),int static count=0; if(count=5) count=0; coutdisplay(); ptItBegin+; count+; cout () endl;,(续),/从字符型双端队列对象中弹出数据 for(i=0;i5;i+) cItEnd=cMyDeque1.end(); coutThe Element will be pop is: *(-cItEnd)endl; cMyDeque1.popback(); cItEnd=cMyDeque1.end(); cItBegin=cMyDeque1.begin(); /输出弹出数据后的字符型双端队列对象的数据 while(cItBegin!=cItEnd) cout*cItBegin ; cItBegin+; cout endl; nItBegin=nMyDeque1.begin(); nItEnd =nMyDeque1.end();,(续),/用一个已经存在的双端队列对象初始化另一个双端队列对象 deque nMyDeque3(nItBegin,nItEnd); deque nMyDeque4(nMyDeque3); /输出两个新的双端队列对象 copy(nMyDeque3.begin(),nMyDeque3.end(),nOutput); cout endl; copy(nMyDeque4.begin(),nMyDeque4.end(),nOutput); cout endl; /源程序结束,(续),向量、链表和双端队列都具有类似的功能,通常首选使用向量,如果在对象序列中间存在频繁插入和删除操作,这时链表是一种明智的选择,若在对象序列的两端存在频繁的插入和删除操作,则应当选择双端队列。,(续),例 11-5,/EXAMPLE11_5.CPP /源程序开始 #pragma warning (disable : 4786) /防止一个编译警告的出现 #include #include #include ,标准栈是以LIFO方式进行访问的,其基本接口函数为push、pop、size、top、empty。 void push(const T /清空栈,【 11.6 栈与队列】,例 11-5,bool operator nMyStack1; /整型栈 stack dblMyStack1; /双精度型栈 stack cMyStack1; /字符型栈,(续),stack strMyStack1; /字符串型栈 stack ptMyStack1; /Point型栈 /得到各种栈类型对象中的数据 for(int i=1;i=10;i+) /用push()入栈 nMyStack1.push(i); dblMyStack1.push(i/10.0); cMyStack1.push(A+i); Point *point=new Point(i,i); ptMyStack1.push(*point); /用top()显示当前栈顶元素 coutnMyStack1.top() ; coutdblMyStack1.top() ; coutcMyStack1.top() ; ptMyStack1.top().display(); cout ; couti=iendl; ,(续),/用push()入栈,用top()显示当前栈顶元素 strMyStack1.push(I ); coutstrMyStack1.top(); strMyStack1.push(Like ); coutstrMyStack1.top(); strMyStack1.push(C+!); coutstrMyStack1.top(); coutendl; /求各个栈中元素数目 coutthe size of nMyStack1=nMyStack1.size()endl; coutthe size of dblMyStack1=dblMyStack1.size()endl; coutthe size of cMyStack1=cMyStack1.size()endl; coutthe size of ptMyStack1=ptMyStack1.size()endl; coutthe size of strMyStack1=strMyStack1.size()endl; /用top()显示栈顶元素,用pop()出栈 for(;!nMyStack1.empty();) coutnMyStack1.top() ; nMyStack1.pop(); coutendl;,(续),/用top()显示栈顶元素,用pop()出栈 for(;!dblMyStack1.empty();) coutdblMyStack1.top() ; dblMyStack1.pop(); coutendl; /用top()显示栈顶元素,用pop()出栈 for(;!cMyStack1.empty();) coutcMyStack1.top() ; cMyStack1.pop(); coutendl; /用top()显示栈顶元素,用pop()出栈 for(;!strMyStack1.empty();) coutstrMyStack1.top() ; strMyStack1.pop();,(续), coutendl; /用top()显示栈顶元素,用pop()出栈 for(;!ptMyStack1.empty();) int static count=0; if(count=5) count=0; coutendl; ptMyStack1.top().display(); ptMyStack1.pop(); count+; coutendl; /源程序结束,(续),队列的访问方式是FIFO,队列的主要函数与栈相似:front返回队列首部对象的引用、back返回队列尾对象的引用,push入队到队列尾,pop从队首出队,empty判断队空,size获得队中元素数目。,(续),例如:自集、交集、差集,通过includes、setintersection、 setdifference等函数实现的。 template OutIt setdifference(InIt1 first1,InIt1 last1,InIt2 first2, InIt2 last2, OutIt x); 该函数将集合InIt1中从first1到last1中的元素与集合InIt2中从first2到last2中的元素进行比较,将属于InIt1但不属于InIt2的元素形成一个序列,由x指示 (本例中将符合条件的元素用inserter函数插入到新的集合中)。 template OutIt setintersection(InIt1 first1,InIt1 last1,InIt2 first2, InIt2 last2, OutIt x);该函数用法与setdifference相同,求两个集合的交集。 template bool includes(InIt1 first1, InIt1 last1, InIt2 first2, InIt2 last2); 该函数求InI t2所指示的集合范围(first2,last2)是否是InIt1所指示的集合范围(first1,last1)的子集。,【 11.7 集合】,例 11-6, x=xx;y=yy; void display() /显示函数 coutPoint(x,y) ; int getx() const return x; int gety() const return y; bool operator=(const Point ,(续),bool Point:operator nMySet1 ,nMySetDifference,nMySetIntersection; /整型集合 set dblMySet1,dblMySetDifference,dblMySetIntersection; /双精度型 /集合 set cMySet1,cMySetDifference,cMySetIntersection; /字符型集合 set strMySet1,strMySetDifference,strMySetIntersection; /字符串型集合 set ptMySet1,ptMySetDifference,ptMySetIntersection; /Point型集合 /针对不同集合类型的迭代子,(续),set:iterator nItBegin1,nItEnd1, nItBegin2,nItEnd2; set:iterator dblItBegin1,dblItEnd1, dblItBegin2,dblItEnd2; set:iterator cItBegin1,cItEnd1, cItBegin2,cItEnd2; set:iterator strItBegin1,strItEnd1, strItBegin2,strItEnd2; set:iterator ptItBegin1,ptItEnd1, ptItBegin2,ptItEnd2; /针对不同集合类型的输出流迭代子 ostream_iterator nOutput(cout, ); ostream_iterator dblOutput(cout, ); ostream_iterator cOutput(cout, ); ostream_iterator strOutput(cout, ); /得到各种集合类型对象中的数据 for(int i=1;i=10;i+) nMySet1.insert(i);,(续),dblMySet1.insert(i/10.0); cMySet1.insert(A+i); Point *point=new Point(i,i); ptMySet1.insert(*point); strMySet1.insert(I ); strMySet1.insert(Like ); strMySet1.insert(C+!); /将不同集合类型对象中的数据输出到标准输出流,显示出来。 copy(nMySet1.begin(),nMySet1.end(),nOutput); cout endl; copy(dblMySet1.begin(),dblMySet1.end(),dblOutput); cout endl; copy(cMySet1.begin(),cMySet1.end(),cOutput); cout endl; copy(strMySet1.begin(),strMySet1.end(),st

温馨提示

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

评论

0/150

提交评论