您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > 第九章 模板及标准模板库(STL)
第八章内容回顾重载操作符的必要性重载操作符返回值还是引用操作符作为成员函数第九章模板及标准模板库(STL)预习检查定义模板的关键字是?举出两个标准模板的名字?3本章结构模板重载STL模板函数vector的使用方法概念类模板定义及使用map的使用方法迭代器的使用list的使用方法queue的使用方法9-1-1概念模板是C++语言相对较新的一个重要特性。模板使程序员能够快速建立具有类型安全的类库集合和函数集合,它的实现,方便了大规模的软件开发。本节介绍了模板的概念、定义和使用模板的方法,通过这些介绍,使渎者有效地把握模板,以便能正确使用C++系统中日渐庞大的标准模板类库9-1-1概念函数模板的—般定义形式是:template类型形式参数表返回类型FunctionName(形式参数表){//函数定义体}可以包含基本数据类型,也可以包含类类型。如果是类类型,则须加前缀class9-1-2模板函数求绝对值的模板:#includeiostreamusingnamespacestd;templatetypenameTTabs(Tx){returnx0?-x:x;}intmain(){intn=-5;doubled=-5.5;coutabs(n)endl;coutabs(d)endl;}9-1-2模板函数交换任何一对类类型对象,可以定义如下:voidswap(T&a,T&b){Ttemp=a;a=b;b=temp;}有了函数模板之后,重载就不必要了9-1-2模板函数对于具有各种参数类型,相同个数,相同顺序的同一函数(重载函数),如果用宏定义来写:#definemax(a,b)((a)(b)?(a):(b))则它不能检查其数据类型,损害了类型安全性。templateclassTTmax(Ta,Tb){returnab?a:b;//T类的操作须有定义}9-1-3类模板定义及使用类模板的作用使用类模板使用户可以为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本类型的和用户自定义类型)。类模板定义:在类模板以外定义其成员函数:template模板参数表class类名{类成员声明}template模板参数表类型名类名T::函数名(参数表)9-1-3类模板定义及使用创建类模板的实例:className类型实在参数表object;类模板与模板类的区别。类模板是模板的定义,不是一个实实在在的类,定义中用到通用类型参数。模板类是实实在在的类定义,是类模板的实例化。类定义中参数被实际类型所代替。9-1-3类模板定义及使用用类模板来定义一个通用链表,此时该通用链表还不是一个类定义,只是类定义的一个框架,即类模板。templateclassTclassList{...voidAdd(T&);voidRemove(T&);T*Find(T&);voidPrintList();...Node*pFirst;//链首结点指针};9-1-3类模板定义及使用类模板实现voidListT::Add(T&t){Node*temp=newNode;temp-pT=&t;temp-pNext=pFirst;pFirst=temp;}可以发现函数实现几乎和不用模板一样9-2标准模板类将程序写得尽可能通用将算法从特定的数据结构中抽象出来,成为通用的C++的模板为泛型程序设计奠定了关键的基础STL是泛型程序设计的一个范例容器(container)迭代器(iterator)算法(algorithms)函数对象(functionobject)9-2标准模板类容器类是容纳、包含一组元素或元素集合的对象。七种基本容器:向量(vector)双端队列(deque)列表(list)集合(set)多重集合(multiset)映射(map)多重映射(multimap)9-2标准模板类容器的接口通用容器运算符==,!=,,=,,=,=方法(函数)迭代方法begin(),end(),rbegin(),rend()访问方法size(),max_size(),swap(),empty()9-2标准模板类顺序容器的接口插入方法push_front(),push_back(),insert(),运算符“=”删除方法pop(),erase(),clear()迭代访问方法使用迭代器其他顺序容器访问方法(不修改访问方法)front(),back(),下标[]运算符9-2-1vector的使用方法向量(vector)属于顺序容器,用于容纳不定长线性序列(即线性群体),提供对序列的快速随机访问(也称直接访问)向量是动态结构,它的大小不固定,可以在程序运行时增加或减少。9-2-1vector的使用方法向量的使用#includevector#includealgorithmusingnamespacestd;vectorintnum;//STL中的vector容器intelement;//从标准输入设备读入整数,//直到输入的是非整型数据为止while(cinelement)num.push_back(element);//STL中的排序算法sort(num.begin(),num.end());9-2-1vector的使用方法//STL中的排序算法sort(num.begin(),num.end());是算法(algorithm)库中的排序函数sort模板有两种:templateclassRanItvoidsort(RanItfist,RanItlast);templateclassRanIt,classPredvoidsort(RanItfist,RanItlast,Predpr);第一种模板,sort重排[first,last)之间的元素,产生一个按operate排列的序列。sort将序列中的元素以升序方式排列第二种模板和前一个的行为相似,不过它用pr(X,Y)代替了operate(x,y)。9-2-2迭代器的使用方法迭代器是面向对象版本的指针指针可以指向内存中的一个地址迭代器可以指向容器中的一个位置STL的每一个容器类模版中,都定义了一组对应的迭代器类。使用迭代器,算法函数可以访问容器中指定位置的元素,而无需关心元素的具体类型。9-2-2迭代器的使用方法vectorint::iteratoriter;这条语句定义了一个名为iter的变量,它的数据类型是由vectorint定义的iterator类型。begin和end操作如果容器中有元素的话,由begin返回的迭代器指向第一个元素:vectorint::iteratoriter=ivec.begin();由end操作返回的迭代器指向vector的“末端元素的下一个”。通常称为超出末端迭代器(off-the-enditerator)。9-2-2迭代器的使用方法vector迭代器的自增和解引用运算for(vectorint::size_typeix=0;ix!=ivec.size();++ix)ivec[ix]=0;//用下标方式将vector所有的元素清0for(vectorint::iteratoriter=ivec.begin();iter!=ivec.end();++iter)*iter=0;//将iterator指向的元素设为09-2-2迭代器的使用方法const_iterator该类型只能访问容器内元素,但不能改变其值对const_iterator类型解引用时,则可以得到一个指向const对象的引用,如同任何常量一样,该对象不能进行重写。不要把const_iterator对象与const的iterator对象混淆起来,const的iterator不能做自增减,但可以对它指向的元素赋值for(vectorstring::const_iteratoriter=text.begin();iter!=text.end();++iter)cout*iterendl;9-2-3list的使用方法构造列表list容器类有四种形式的构造函数:list();//构造size()为0的列表list(sizetypen,constT&v=T());//初始化大小为n的列表,把列表中的每个对象初始化为T()构造的对象list(constlist&x);//按另一个列表x初始化列表list(constiteratorfirst,constiteratorlast);//从另一个支持constiterator的容器中选取一部分来建立一个新的列表9-2-3list的使用方法访问列表列表是顺序访问的容器,它的访问函数有:begin,end,rbegin,rend,size,max_size,empty,front和back插入元素列表也有insert函数,列表的insert函数不会使任何迭代子或引用变得无效。另外,链式结构的最大优点就是序列便于重组,插入或删除链表中对象时无需移动其他对象的存储位置。删除元素remove成员函数可以从列表中删除与x相等的元素,原型如下:voidremove(constT&x);9-2-3list的使用方法列表应用举例#includelistusingnamespacestd;listintLink;//构造一个列表用于存放整数链表Link.push_front(item);listint::iteratorp=Link.begin();//迭代子P用于遍历链表while(p!=Link.end()){cout*p;p++;//使P指向下一个节点}Link.remove(key);//链表的删除操作9-2-4queue的使用问题queue应用举例#includestack#includequeueusingnamespacestd;stackintst;queueintq;st.push(10);st.push(20);q.push(30);//queue和stack都有push操作q.push(40);9-2-4queue的使用问题queue应用举例coutst.top()end1;st.pop();coutst.top()endl;coutq.front()endl;q.pop();coutq.front()endl;while(!st.empty())//当然queue也能这样用{inta=st.top();coutaendl;st.pop();}9-2-5map的使用问题map是STL的一个关联容器,它提供一对一的数据处理能力其中第一个可以称为关键字,每个关键字只能在map中出现一次第二个可能称为该关键字的值map内部所有的数据都是有序的,后边我们会见识到有序的好处。mapint,stringmapStudent;准确描述了一个学生的学号和姓名的对应关系9-2-5map的使用问题map的构造函数mapint,stringmapStudent;map数据的插入第一种:用insert函数插入pair数据第二种:用insert函数插入value_type数据mapint,stringmapStudent;mapStudent.insert(pairint,string(1,“student_one”));mapint,stringmapStudent;mapStudent.insert(mapint,string::value_type(1,“student_one”));9-2-5map的使用问题第三种:用数组方式插入数据我们通过pair的第二个变量来知道是否插入成功,它的第一个变量返回的是一个map的迭代器,如果插入成功的话Insert_Pair.second应该是true的,否则为false。pairmapint,string::iterator,bo
本文标题:第九章 模板及标准模板库(STL)
链接地址:https://www.777doc.com/doc-3231275 .html