第6章 C标准模板库_第1页
第6章 C标准模板库_第2页
第6章 C标准模板库_第3页
第6章 C标准模板库_第4页
第6章 C标准模板库_第5页
已阅读5页,还剩100页未读 继续免费阅读

下载本文档

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

文档简介

C+:面向对象程序设计(第2版),*第6章C+标准模板库,6.1标准模板库概述,6.1.1标准模板库发展简介,20世纪70年代,被称之为标准模板库(StandardTemplateLibrary,STL)之父的AlexanderStepanov考虑在保证效率的前提下,将算法从诸多具体应用之中抽象出来的可能性,逐渐形成一种软件设计的概念性框架在1994年的滑铁卢会议上,委员们最终通过了提案,决定将STL正式纳入C+标准化进程之中,随后STL便被放进了会议的工作文件中。自此,STL终于成为C+家族中的重要一员,6.1.2标准模板库的主要内容,标准模板库主要包含容器、算法和迭代器三大部分容器包含了绝大多数数据结构,如数组(向量)、链表、队列和栈等。开发者直接应用这些系统容器相关类模板就可以实现相关的功能算法包含了诸如查询和排序等系统函数模板,开发者可以直接操作这些函数模板实现相应功能迭代器类似指针,通过它的有序移动把容器中的元素与算法关联起来标准模板库也包含其他一些内容,如字符串、输入/输出流等内容,将补充介绍字符串,第7章将对输入/输出进行介绍,表6.1常用STL包含文件,6.2迭代器,迭代器是STL的核心技术,通过迭代器提供了统一访问容器元素的方法,为编制通用算法提供了坚实的技术基础,6.2.1迭代器的起源,迭代器也可称为智能指针,迭代器可以使容器和算法分离开来例,有两个容器类模板:Array是数组类模板;Link是链表类模板。它们都有显示、查询和排序等功能,常规思维是每个容器类模板中都有自己的显示、查询和排序等函数模板。但不同容器中完成相同功能代码的思路大体是相同的,那么能不能把它们抽象出来呢?使得多个容器仅对应一个显示、一个查询、一个排序函数模板呢?这就是泛型思维发展的本质,这样便产生了迭代器的思维方式,下面通过具体实例以便读者能理解迭代器的思维方式,例6.1为数组类模板、链表类模板编制共同显示函数模板。对于显示C数组a“inta=1,2,3,4,5,6;”,可采用如下程序代码实现/文件路径名:s6_1_1smain6_1_1.cpp/smain6_1_1.cpp文件开始#include/编译预处理命令usingnamespacestd;/使用命名空间stdvoidShow(int*begin,int*end)/显示for(int*it=begin;it!=end;+it)/依次显示各元素cout*it;coutnext;/head指向下一结点deletep;/释放p所指存储空间,voidAppend(constType,3编写泛型显示函数模板,下面仿照前面的显示C数组的函数Show()编写一个数组类模板与链表类模板的共同函数模板,具体代码如下:templatevoidShow(Itbegin,Itend)/泛型显示for(Itit=begin;it!=end;+it)/依次显示各元素cout*进行操作。在STL中用迭代器类模板代表It,它仍然是一个类模板,4定义数组迭代器模板,templateclassArrayIteratorprivate:Type*itPtr;/迭代器本质是对Type*的封装public:ArrayIterator(Type*p):itPtr(p)/构造函数模板booloperator!=(constArrayIterator,必须重载运算符“!=”、后缀“+”和“*”等运算符,这是由于Show()泛型显示函数模板用到这些运算符,5定义链表迭代器模板,templateclassLinkIteratorprivate:Node*itPtr;/迭代器本质是对Node*的封装/比教材上的“Type*”更直接public:LinkIterator(Node*p):itPtr(p)/构造函数模板booloperator!=(constLinkIterator,同样必须重载运算符“!=”、后缀“+”和“*”等运算符,6测试显示数组类模板的泛型函数模板,/文件路径名:s6_1_2smain6_1_2.cpp/smain6_1_2.cpp文件开始#include/编译预处理命令usingnamespacestd;/便用命名空间std/定义数组类模板templateclassArray;/定义数组迭代器类模板templateclassArrayIteratortemplatevoidShow(Itbegin,Itend)/泛型显示,intmain()/主函数main()inta=1,2,3,4,5,6;/定义C数组aintn=6;/数组元素个数Arrayarr;/定义数组对象inti;/定义临时变量for(i=0;ibegin(arr.Begin();/定义beginArrayIteratorend(arr.End();/定义endcout数组元素:;/输出提示Show(begin,end);/显示数组system(PAUSE);/调用库函数system(),输出系统提示信息return0;/返回值0,返回操作系统/smain6_1_2.cpp文件结束,程序运行时屏幕输出如下:123456请按任意键继续.,7测试显示链表类模板的泛型函数模板,/文件路径名:s6_1_3smain6_1_3.cpp/smain6_1_3.cpp文件开始#include/编译预处理命令usingnamespacestd;/使用命名空间stdtemplate/定义结点类模板structNode;template/定义链表类模板classLink;template/定义链表迭代器类模板classLinkIterator;templatevoidShow(Itbegin,Itend)/泛型显示,intmain()/主函数main()inta=1,2,3,4,5,6;/定义C数组aintn=6;/元素个数Linkla;/定义链表对象inti;/定义临时变量for(i=0;ibegin(la.Begin();/定义beginLinkIteratorend(la.End();/定义endcoutend(la.End();/定义end,6.2.2迭代器类模板位置,在前面介绍的关于数组迭代器、链表迭代器的代码中,迭代器类模板位于容器类模板之外经仔细查看可以发现,数组迭代器只能应用于数组容器,不能应用于链表容器,链表迭代器也只能应用于链表容器,不能应用于数组容器特定的容器应该有特定的迭代器。将迭代器类模板作为容器类模板的内部类模板更符合应用的特点。下面以Link为例,融合LinkIterator后具体测试程序如下(Node类模板也是隶属于Link容器类模板,因此也将其一起进行合并),/文件路径名:s6_1_4smain6_1_4.cpp/smain6_1_4.cpp文件开始#include/编译预处理命令usingnamespacestd;/便用命名空间std/定义链表类模板templateclassLinkpublic:/定义内嵌类模板/定义内嵌结点类模板structNode/用struct定义的类(模板)的成员缺省为公有防问权限Typedata;/数据Node*next;/指针Node(constType,/定义内嵌链表迭代器类模板classLinkIteratorprivate:/数据成员:Node*itPtr;/迭代器本质是对Node*的封装public:/公有函数模板:LinkIterator(Node*p):itPtr(p)/构造函数模板booloperator!=(constLinkIterator,此处Node不写成Node,比在链表类模板外定义迭代器(必须加)更简洁,public:/公有函数模板Link():head(NULL),prev(NULL),tail(NULL)/构造函数模板virtualLink()/析构函数模板while(head!=NULL)/链表非空Node*p=head;/p指向第一个链表元素结点head=p-next;/head指向下一结点deletep;/释放p所指存储空间,voidAppend(constType/返回结束,private:/数据成员:Node*head;/表头Node*tail;/表尾(为了后面实现迭代器的需要,不是指向/最后一个元素,而是此元素的后面,此处将/表尾定义为NULL)Node*prev;/表尾前驱(prev-next=tail);templatevoidShow(Itbegin,Itend)/泛型显示for(Itit=begin;it!=end;+it)/依次显示各元素cout*it;coutendl;/换行,intmain()/主函数main()inta=1,2,3,4,5,6;/定义C数组aintn=6;/元素个数Linkla;/定义链表对象inti;/定义临时变量for(i=0;i:LinkIteratorbegin(la.Begin();/定义beginLink:LinkIteratorend(la.End();/定义endcout链表元素:;/输出提示Show(begin,end);/显示链表system(PAUSE);/调用库函数system(),输出系统提示信息return0;/返回值0,返回操作系统/smain6_1_4.cpp文件结束,程序运行时屏幕输出如下:123456请按任意键继续.,6.2.3迭代器的编程思想,前面泛型显示函数模板Show()就是STL中的算法,根据前面详细介绍的迭代器的编程思路用图形来描述如图所示,6.3函数对象,STL通过重载类模板中的函数运算符“()”实现函数对象函数对象可以对容器中的数据进行各种各样的操作,同时还能维护自己的状态,6.3.1从函数到函数对象,下面设计一个遍历算法ForEach()函数模板:templateFun/返回f下面的示例是采用遍历算法ForEach()求保存在数组中的整数之和,例6.2采用遍历算法ForEach()求保存在数组中的整数之和的示例。/文件路径名:s6_2smain6_2.cpp/smain6_2.cpp文件开始#include/编译预处理命令usingnamespacestd;/使用命名空间stdintsum=0;/用于存储累加和voidSum(inte)/累加求和sum=sum+e;/sum累加etemplateFun/返回值0,返回操作系统/smain6_2.cpp文件结束,Sum()是全局普通函数,sum是求和全局变量,用于求和,将求和过程封装在类中并重载函数运算符“()”,这样便实现了函数对象,程序运行时屏幕输出如下:sum=21请按任意键继续.,例6.3用类封装例6.2中的函数Sum(),并用重载函数运算符“()”实现函数Sum()的功能的实例。/文件路径名:s6_3smain6_3.cpp/smain6_3.cpp文件开始#include/编译预处理命令usingnamespacestd;/使用命名空间std/定义累加求和类classSumprivate:/数据成员:intsum;/用于存储累加和public:/公有成员:Sum():sum(0)/构造函数voidoperator()(inte)/重载函数运算符sum=sum+e;/sum累加eintGetSum()const/求累加和returnsum;/返回累加和sum;,templateFun/返回值0,返回操作系统/smain6_3.cpp文件结束,objSum便是函数对象,Sum()是通过调用无参构造函数生成一个临时函数对象。并作实参传入遍历算法ForEach(),用于累加求和。然后通过成员函数GetSum()取得并输出累加和。如果将类Sum进一步定义为类模板,适用泛围更广,这样更具有STL的特点,程序运行时屏幕输出如下:sum=21请按任意键继续.,例6.4用例6.3中的类Sum推广为类模板。/文件路径名:s6_4smain6_4.cpp/smain6_4.cpp文件开始#include/编译预处理命令usingnamespacestd;/使用命名空间std/定义累加求和类模板SumtemplateclassSumprivate:/数据成员:Typesum;/用于累加求和public:/公有成员:Sum():sum(0)/构造函数模板voidoperator()(Typee)/重载函数模板运算符sum=sum+e;/sum累加eTypeGetSum()const/求累加和returnsum;/返回累加和sum;,templateFun/返回值0,返回操作系统/smain6_4.cpp文件结束,程序运行时屏幕输出如下:sum=21请按任意键继续.,6.3.2系统函数对象类模板,STL提供了大量系统函数对象类模板,主要包含有如下几类函数对象类模板算术类关系运算类逻辑运算类,表6.2常用系统函数对象类模板,1算术函数对象,算术函数对象主要包括加法、减法、乘法、除法、求余及取反等操作,例6.5算术类基本函数对象使用示例。/文件路径名:s6_5smain6_5.cpp/smain6_5.cpp文件开始#include/编译预处理命令#include/编译预处理命令usingnamespacestd;/使用命名空间stdintmain()/主函数main()/下面定义一些算术函数对象plusobjPlus;/定义加法算术函数对象minusobjMinus;/定义减法算术函数对象multipliesobjMul;/定义乘法算术函数对象dividesobjDiv;/定义除法算术函数对象modulusobjMod;/定义求余算术函数对象negateobjNeg;/定义取反算术函数对象/下面运用上面定义的函数对象,实现相应的函数功能coutobjPlus(2,6)endl;/输出2+6coutobjMinus(2,6)endl;/输出2-6coutobjMul(2,6)endl;/输出2*6coutobjDiv(2,6)endl;/输出2/6coutobjMod(2,6)endl;/输出2%6coutobjNeg(2)endl;/输出-2,/下面直接以生成的临时函数对象实现相关函数功能cout()(2,6)()(2,6)()(2,6)()(2,6)()(2,6)()(2)endl;/输出-2system(PAUSE);/调用库函数system(),输出系统提示信息return0;/返回值0,返回操作系统/smain6_5.cpp文件结束,程序运行时屏幕输出如下:8-41202-28-41202-2请按任意键继续.,2关系函数对象,关系函数对象主要包括等于、不等于、大于、大于等于、小于、小于等于6种运算,例6.6关系运算类基本函数对象使用示例。/文件路径名:s6_6smain6_6.cpp/smain6_6.cpp文件开始#include/编译预处理命令#include/编译预处理命令usingnamespacestd;/使用命名空间stdintmain()/主函数main()/下面定义一些关系函数对象equal_toobjEqual;/定义等于函数对象not_equal_toobjNotEqual;/定义不等于函数对象greaterobjGreat;/定义大于函数对象greater_equalobjGreatEqual;/定义大于等于函数对象lessobjLess;/定义小于函数对象less_equalobjLessEqual;/定义小于等于函数对象/下面运用上面定义的函数对象,实现相应的函数功能coutobjEqual(2,6)endl;/输出0coutobjNotEqual(2,6)endl;/输出1coutobjGreat(2,6)endl;/输出0coutobjGreatEqual(2,6)endl;/输出0coutobjLess(2,6)endl;/输出1coutobjLessEqual(2,6)endl;/输出1,/下面直接以生成的临时函数对象实现相关函数功能cout()(2,6)()(2,6)()(2,6)()(2,6)()(2,6)()(2,6)endl;/输出1system(PAUSE);/调用库函数system(),输出系统提示信息return0;/返回值0,返回操作系统/smain6_6.cpp文件结束,程序运行时屏幕输出如下:010011010011请按任意键继续.,3逻辑函数对象,逻辑函数对象主要有与、或、非三种运算,例6.7逻辑函数对象用法示例。/文件路径名:s6_7smain6_7.cpp/smain6_7.cpp文件开始#include/编译预处理命令#include/编译预处理命令usingnamespacestd;/使用命名空间stdintmain()/主函数main()/下面定义一些逻辑函数对象logical_andobjAnd;/定义逻辑与函数对象logical_orobjOr;/定义逻辑或函数对象logical_notobjNot;/定义逻辑非函数对象/下面运用上面定义的函数对象,实现相应的函数功能cout()(true,true)()(true,false)()(true)endl;/输出0system(PAUSE);/调用库函数system(),输出系统提示信息return0;/返回值0,返回操作系统/smain6_7.cpp文件结束,程序运行时屏幕输出如下:110110请按任意键继续.,6.4常用通用容器,STL提供了专家级的几乎我们所需要的各种容器,功能更加强大,复用性更强开发应用程序应多用STL容器类模板,6.4.1vector容器,vector类模板称做向量类模板,实现了动态的数组,用于元素个数动态变化的对象数组像数组一样,vector类模板也用从0开始的下标表示元素的位置与数组不同的是,数组的元素个数会随着vector对象元素个数的增大和缩小自动变化,vector类模板常用成员函数模板,1构造函数模板,vector():创建一个空vectorvector(intn):创建一个vector,其元素个数为nvector(intnSize,constType/使用命名空间stdintmain()/主函数main()vectorv;/定义向量inta=1,2,3,4,5,n=5,i;/定义数组及整型变量for(i=0;in;+i)/依次向v添加元素v.push_back(ai);/通过push_back()函数添加元素n=v.size();/获得向量元素个数cout通过数组方式输出:endl;/输出提示for(i=0;in;+i)/依次输出各元素coutvi;/输出vicoutendl;/换行,cout:iteratorit=v.begin();it!=v.end();+it)/依次输出各元素cout*it;/输出*itcoutendl;/换行system(PAUSE);/调用库函数system(),输出系统提示信息return0;/返回值0,返回操作系统/smain6_8.cpp文件结束,程序运行时屏幕输出如下:通过数组方式输出:12345通过获得引用输出:12345通过迭代器输出:12345请按任意键继续.,6.4.2list容器,1ist是一个双向链表,每次插入或删除一个元素就配置或释放一个元素空间,1ist容器有如下常用成员函数模板,1构造函数模板,list():创建一个空的listlist(constlist/使用命名空间stdtypedeflistStrList;/类型定义intmain()/主函数main()StrListla;/定义链表对象la.push_back(back);/向链表尾后插入backla.push_front(middle);/向链表首元素前插入middlela.push_front(front);/向链表首元素前插入frontcoutla.front()endl;/输出首元素frontcout*la.begin()endl;/输出首元素frontcoutla.back()endl;/输出尾元素backcout*la.rbegin()endl;/输出尾元素backla.pop_front();/删除frontla.pop_back();/删除backcoutla.front()endl;/输出middlesystem(PAUSE);/调用库函数system(),输出系统提示信息return0;/返回值0,返回操作系统/smain6_9.cpp文件结束,程序运行时屏幕输出如下:frontfrontbackbackmiddle请按任意键继续.,“la.front()”相当于“string/使用命名空间stdintmain()/主函数main()listla;/定义链表对象for(inti=1;i:iteratorit=la.begin();it!=la.end();+it)/依次输出各元素的值cout:reverse_iteratorrit=la.rbegin();rit!=la.rend();+rit)/依次输出各元素的值cout*rit;/输出*ritcoutendl;/换行system(“PAUSE”);/调用库函数system(),输出系统提示信息return0;/返回值0,返回操作系统/smain6_10.cpp文件结束,正向迭代器与逆向迭代器类模板形式是不一样的,前者是iterator,后者是reverse_iterator。另外,逆向显示并不改变元素在容器中的位置,只是显示顺序改变了,程序运行时屏幕输出如下:123456654321请按任意键继续.,例6.11sort()、reverse()成员函数模板使用示例。/文件路径名:s6_11smain6_11.cpp/smain6_11.cpp文件开始#include/编译预处理命令#include/编译预处理命令usingnamespacestd;/使用命名空间stdintmain()/主函数main()listla;/定义链表对象list:iteratorit;/定义迭代器inta=1,6,3,5,4,2,n=6;/定义数组及整型变量for(inti=0;in;+i)/依次向线性表中插入aila.push_back(ai);/向链表表尾追加aifor(it=la.begin();it!=la.end();+it)/显示链表/依次输出各元素的值cout*it;/输出*itcoutendl;/换行,la.reverse();/反转链表元素顺序for(it=la.begin();it!=la.end();+it)/显示链表/依次输出各元素的值cout*it;/输出*itcoutendl;/换行la.sort();/升序排序链表for(it=la.begin();it!=la.end();+it)/显示链表/依次输出各元素的值cout*it;/输出*itcoutendl;/换行system(PAUSE);/调用库函数system(),输出系统提示信息return0;/返回值0,返回操作系统/smain6_11.cpp文件结束,程序运行时屏幕输出如下:163542245361123456请按任意键继续.,6.4.3deque容器,deque容器支持高效插入和删除容器的首尾部元素,deque容器也叫做双端队列,deque类模板常用的成员函数模板,1构造函数模板,deque():创建一个空dequedeque(constdeque/使用命名空间stdintmain()/主函数main()dequeq;/定义双端队列对象deque:iteratorit;/定义迭代器inta=5,1,8,18,16,19,n=6,i,e;/定义数组及整型变量for(i=0;in;+i)/依次向双端队列中插入aiq.push_back(ai);/向双端队列尾追加aifor(it=q.begin();it!=q.end();+it)/显示双端队列/依次输出各元素的值cout*it;/输出*itcoutendl;/换行,q.clear();/清空双端队列for(i=0;in;+i)/依次向双端队列中插入aiq.push_front(ai);/向双端队列首部插入aifor(it=q.begin();it!=q.end();+it)/显示双端队列/依次输出各元素的值cout*it;/输出*itcoutendl;/换行q.pop_front();/删除首元素coutq.front()endl;/输出新首元素q.pop_back();/删除尾元素coutq.back()classqueueprivate:/私有成员:Containerc;/用于存储队列元素public:/公有函数模板:voidpush(constType,标准模板库基础容器类模板Container对应的变量c,队列的各个元素存在于容器c中,push()函数模板是通过调用Container类模板中的成员函数模板push_back()完成队列的插入操作的,queue类模板是对基础容器类模板Container的再封装。队列类模板queue的各个成员函数模板其实操作的是Container类模板中的成员函数模板,queue只是起一个中介作用,queue就是一个容器配接器,这就是容器配接器的概念,例6.13stack使用示例。/文件路径名:s6_13smain6_13.cpp/smain6_13.cpp文件开始#include/编译预处理命令#include/编译预处理命令#include/编译预处理命令usingnamespacestd;/使用命名空间stdintmain()/主函数main()stacks;/定义栈对象for(inti=1;i=5;+i)/依次入栈s.push(i);/i入栈cout栈s:;/输出提示while(!s.empty()/栈s非空couts.top();/输出栈顶s.pop();/出栈coutq;/定义队列对象for(inti=1;i=5;+i)/依次入栈q.push(i);/i入队cout队列q:;/输出提示while(!q.empty()/队列s非空coutq.front();/输出队列q.pop();/出队coutendl;/换行system(PAUSE);/调用库函数system(),输出系统提示信息return0;/返回值0,返回操作系统/smain6_14.cpp文件结束,程序运行时屏幕输出如下:队列q:12345请按任意键继续.,6.5STL常用算法,STL有大量的算法,限于篇幅,只讨论几个常用算法稍加练习便可举一反三,触类旁通其它算法,6.5.1遍历容器算法for_each(),for_each()算法用于遍历容器元素,对每个元素执行相同的函数模板操作for_each()原型如下所示:templateFunfor_each(Itfirst,Itlast,Funf);对参数说明如下:It:可以是指针类型或迭代器。first:表示数组的起始元素指针或迭代器。1ast:表示数组尾指针或迭代器,不包括最后一个元素,而在其之后。Fun:函数类或函数指针类型。f:一元全局函数或一元函数对象。功能:此函数模板的含义是对first,last)之间的每个元素,作为函数(或函数对象)f的参数传入并执行函数(或函数对象),例6.15显示向量中每个整型元素及相应的立方。/文件路径名:s6_15smain6_15.cpp/smain6_15.cpp文件开始#include/编译预处理命令#include/编译预处理命令#include/编译预处理命令usingnamespacestd;/使用命名空间stdvoidShowCube(intn)/显示参数及相应的立方coutv(n);/定义大小为n的向量for(inti=0;in;+i)/通过数组方式为向量元素赋值vi=i+1;couti:ti*i*iendl;/输出提示for_each(v.begin(),v.end(),ShowCube);/输出v的每个元素及其相应的立方system(PAUSE);/调用库函数system(),输出系统提示信息return0;/返回值0,返回操作系统/smain6_15.cpp文件结束,程序运行时屏幕输出如下:i:i*i*i1:12:83:274:645:1256:2167:3438:512请按任意键继续.,ShowCube()函数必须有且只有一个参数,且参数类型与向量的模板实际参数类型一致,例6.16求整数数组各元素的和、最大值和最小值的实例。由于必须遍历整型数组的每个元素,所以可以应用for_each()算法。当然可以定义全局函数的方法来完成所需功能,但更好的方法是定义一个重载函数运算符的类,具体实现如下:/文件路径名:s6_16smain6_16.cpp/smain6_16.cpp文件开始#include/编译预处理命令#include/编译预处理命令#include/编译预处理命令usingnamespacestd;/使用命名空间std/定义类GetInfoclassGetInfoprivate:/数据成员:intsum;/和intmax;/最大值intmin;/最小值intcount;/元素个数public:/公有函数:GetInfo():sum(0),count(0)/构造函数,intGetSum()const/获得最大值returnsum;/返回和sumintGetMax()const/获得最大值returnmax;/返回最大值maxintGetMin()const/获得最小值returnmin;/返回最小值sum,voidoperator()(inte)/重载单参数的函数运算符count+;/元素个数自加1sum=sum+e;/累加求和if(count=1)/e为第一个元素max=min=e;/最大值与最小值都为eelse/有多个元素if(maxe)/e为当前已求的最小值min=e;/将e赋值给min;,必须重载GetInfo类的函数运算符“()”,本例中重载函数为“voidoperator()(inte)”,用于求数组各元素的和、最大值、最小值的功能,intmain()/主函数main()inta=1,4,2,8,5,6;/定义数组intn=sizeof(a)/sizeof(int);/数组元素个数int*begin=a;/开始int*end=a+n;/结束GetInfoobjGetInfo=for_each(begin,end,GetInfo();/定义函数对象,通过for_each()算法进行初始化cout总和是:objGetInfo.GetSum()endl;/输出总和cout最大值:objGetInfo.GetMax()endl;/输出最大值cout最小值:objGetInfo.GetMin()endl;/输出最小值system(PAUSE);/调用库函数system(),输出系统提示信息return0;/返回值0,返回操作系统/smain6_16.cpp文件结束,程序运行时屏幕输出如下:总和是:26最大值:8最小值:1请按任意键继续.,6.5.2查询算法find(),查询算法find()的原型如下:templateItfind(Itfirst,Itlast,constType对参数说明如下:It:可以是指针类型或迭代器first:表示数组的起始元素指针或迭代器1ast:表示数组尾指针或迭代器,不包括最后一个元素,而在其之后Type:模板类型参数功能:查询first,last)间对应的元素值是否有等于e的,若有则返回其指针或迭代器;若无则返回last,例6.17查询算法使用示例。/文件路径名:s6_17smain6_17.cpp/smain6_17.cpp文件开始#include/编译预处理命令#include/编译预处理命令#include/编译预处理命令usingnamespacestd;/使用命名空间stdintmain()/主函数main()inta=1,4,2,8,5,6;/定义数组intn=sizeof(a)/sizeof(int);/数组元素个数int*begin=a;/开始int*end=a+n;/结束inte=8;/元素值int*p=find(begin,end,e);/指向首次元素值为e的数组元素的指针if(p!=end)cout元素值为e的元素的下标为p-aendl;/查找成功,输出相关信息elsecout查找失败endl;/查找失败system(PAUSE);/调用库函数system(),输出系统提示信息return0;/返回值0,返回操作系统/smain6_17.cpp文件结束,程序运行时屏幕输出如下:元素值为8的元素的下标为3请按任意键继续.,例6.18根据学号查询学生信息。/文件路径名:s6_18smain6_18.cpp/smain6_18.cpp文件开始#include/编译预处理命令#include/编译预处理命令#include/编译预处理命令#include/编译预处理命令usingnamespacestd;/使用命名空间std/定义学生类classStudentprivate:/数据成员:intnum;/学号stringname;/姓名intage;/年龄stringsex;/性别public:/公有成员:Student(intn,conststring/返回学号num,stringGetName()const/返回姓名returnname;/返回姓名nameintGetAge()const/返回年龄returnage;/返回年龄agestringGetSex()const/返回性别returnsex;/返回性别sexbooloperator=(intn)/重载相等运算符“=”returnnum=n;/转化为学号的比较;,面后main()中执行“find(begin,end,findNum);”时,begin,end)间的每一个迭代器所表示的Student对象都要与findNum进行比较,判断是否相等,因此必须重载关系运算符“=”,intmain()/主函数main()vectorv;/定义向量对象v.push_back(Student(20120101,张杰明,18,男);/向v尾插入一个学生信息v.push_back(Student(20120102,吴晓珊,20,女);/向v尾插入一个学生信息v.push_back(Student(20120103,吴洪倩,19,女);/向v尾插入一个学生信息vector:iteratorbe

温馨提示

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

评论

0/150

提交评论