第10章类库和C++的标准模板库STL

上传人:门**** 文档编号:243426075 上传时间:2024-09-23 格式:PPT 页数:61 大小:228.50KB
返回 下载 相关 举报
第10章类库和C++的标准模板库STL_第1页
第1页 / 共61页
第10章类库和C++的标准模板库STL_第2页
第2页 / 共61页
第10章类库和C++的标准模板库STL_第3页
第3页 / 共61页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,C+,面向对象程序设计,教学内容,第,1,章,C+,概述,第,2,章 类和对象,第,3,章 面向对象程序设计概述,第,4,章 进一步学习类和对象,第,5,章 堆与复制构造函数,第,6,章 继承性:派生类,第,7,章 运算符重载,第,8,章 虚函数和多态性,第,9,章 模板,第,10,章 类库和,C+,的标准模板库,STL,第,11,章 输入输出流,第,12,章 异常处理,第,10,章 类库和,C+,的标准模板库,STL,10.1 类库的概念,10.2 C+的标准模板库STL,10.1,类库的概念,1.1.1,什么是类库,(class library),?,1.1.2,如何分析、利用类库?,1.1.3,类库的特点,1.1.4,类库是面向对象的软件开发环境的核心,10.1.1,什么是类库?,类库是类的集合,并且给出了多种类之间的关系描述。,为了便于程序员的开发工作,系统提供了一批可供重用的代码。,(源程序代码),具体表现为一组类,通过建立彼此间的继承关系形成类库,以类的形式提供给用户重用。,什么是类库?,( 续),在设计和实现面向对象的程序的时候,要用类和类库,才能得到所需的对象,即类的实例。,所以,类库是一种预定义的面向对象的程序库。,类库的例子,C+ Standard STL library,Microsoft Visual C+,系统中提供的,MFC,类库。,MFC Microsoft Foundation Class,Borland C+,系统中提供的,OWL,类库。,C+ Builder,系统中提供的,VCL,类库。,类库为软件重用提供基础,OOP,提供的继承机制使得程序员可以在已有类的基础上定义自己需要的新类,从而实现了软件模块的重用。,程序员分工进一步细化,在面向对象的程序设计范型之下,程序员的队伍可能要分为两种,它们都以类作为工作对象,一个队伍主要是设计类和类库,另一个队伍主要是使用类来设计应用程序。,分工细化就意味着进步,10.1.2,如何分析、利用类库?,要想发挥面向对象方法的优势,程序员必须知道类库的组织情况。,我们可以通过联机帮助或类库参考手册(类库工作手册)了解:,软件开发系统提供的类库的类层次结构。,可能需要用到的类及其父类的属性和方法。,通过联机文档提供的例子学习有关类的使用方法。,衡量应用程序员能力的标准的变化,结构化程序设计时代的标准:每天编写的源代码行数,程序结构清晰。,面向对象程序设计时代的标准:,衡量一个应用程序员的生产力,要看他是否知道如何来最好地发挥已有类库的功能,,要看他有没有能力将已有的类库与新问题紧密的匹配起来,,还要看他不得不另外编写的代码是不是最少。,10.1.3,类库有什么特点,通用性,可扩充性,概念性与层次性,灵活性,通用性,基于重用的目的,选择具有广泛适用性的东西作为类库的内容,并经过全面的考虑,使之适用于较多的情况。,可扩充性,在软件开发过程中,可以添加新的类供以后使用。,对已有的类库进行改进时,只要保持接口不变,修改不会引起外部(即应用系统)软件的变化。,概念性与层次性,类库中的每个类的概念要明确,易于理解,将具有某些共同性质的类作为基类。,设计类要有一个明确的目标。,一个好的类应该是容易理解和使用的。,10.1.4,类库是面向对象的软件开发环境的核心,OOP,开发方法只有基于,软件重用,的思想,才能真正提高软件开发的效率和质量。,类库为软件重用提供了基础,程序设计不必再从零开始。,类库不同于传统的子程序库(函数库),它的性能大大优于子程序库。,10.2 C+,的标准模板库,STL,10.2.1,名字空间,namespace,简介,10.2.2 C+,标准库的构成,10.2.3,标准模板库,STL,简介,10.2.4,标准模板库,STL,应用举例,10.2.1,名字空间,namespace,简介,日常生活中人名相同引起的名字冲突;,C+,程序中出现相同的名字引起的冲突:,容器类库中有一个,List,类,窗口类库中有一个,List,类,如果一个程序中要同时使用这两个类库就会发生名字冲突,名字冲突的危害,在同一个源文件(编译单元)中出现的名字冲突可以由编译器,compiler,检查出来:,Redefined Symbols,(,ambiguous symbol,),在不同编译单元(如目标文件)之间的名字冲突可能由链接器,Linker,检查出来:,Identifier multiply defined,也可能导致错误链接,从而产生运行时错误,runtime error,。,名字冲突的原因,C+,中采用的是单一的,全局名字空间,(,参见,),。在这单一的空间中,如果有两个类、两个变量或两个函数的名字完全相同,就会出现名字冲突。,作用域的概念,scope,局部作用域,local scopes,:,块作用域,函数作用域,文件作用域,全局作用域,global scopes,全局标识符号:全局变量名、全局函数名、全局类型名等等,全局名字在整个程序范围内有效,名字空间,namespace,使用名字空间来划分全局名字空间可以避免名字冲突。,解决的办法就是将程序中相同的名字定义在两个不同的名字空间中。,名字空间,namespace,(续),名字空间就是为解决,C+,中的变量、函数等的名字冲突而服务的。,程序规模越大,名字空间就越有用。,The larger a program is, the more useful namespaces are to express logical separations of its parts.,namespace,又译作 :命名空间、名称空间,名字空间的例子,/,两个在不同命名空间中定义的名字相同的变量,namespace,myown1,string user_name = myown1;,namespace,myown2,string user_name = myown2;,名字空间的名字,int main(),cout n Hello, ,myown1,:user_name, . and goodbye!n;,cout n Hello, ,myown2,:user_name, . and goodbye!n;,return 0;,用命名空间限制符,myown1,访问变量,user_name,用命名空间限制符,myown2,访问变量,user_name,int main( ),using namespace myown1;,cout n Hello, , user_name . and goodbye!n;,/using namespace myown2;,cout n Hello, , myown2:user_name, . and goodbye!n;,return 0;,用命名空间限制符,myown2,访问变量,user_name,无需,用命名空间限制符,myown1,访问变量,user_name,创建名字空间,namespace,namespacename,/ / declaration and definitions,可见,创建名字空间与定义一个类很相似,实际上类名就是一个名字空间的名字。,using namespace,关键字,using,将一个名字空间变为可见,实际上只是将该名字空间的名字添加到当前名字空间中。,命令,using,的作用域从其声明之处开始并持续到当前作用域,scope,结束。,在使用一个名字空间时,并不会覆盖当前的名字空间。,using namespace,的有效范围,int,main( ),using namespace myown1;,cout, n Hello, , user_name . and goodbye!n;,using namespace myown2;,cout, n Hello, , user_name, . and goodbye!n;,return 0;,名字空间小结,一、名字空间解决了,C+,的,名字冲突问题,二、注意名字空间,namespace,的书写格式,和类,class,相似或相同。,三、名字空间名必需是唯一的,否则必需在它们的外面再套上一层名字空间,亦即名字空间可以和类一样的嵌套使用,四、同名类在声明实例时必需加上名字空间作用域符“名字空间名,:,类名”,五、不一定只有类才可加上名字空间的外套,其它如,局部变量、函数等都可加上名字空间外套。,10.2.2 C+,标准库的构成,基本的运行库,例如支持动态内存分配、运行时类型信息,RTTI,C,语言的标准库,标准模板库(,STL,),输入输出流类库(,I/O Stream,),和字符串,数值计算库,例如支持复数的计算,C+,标准库名字空间,#include ,using namespace,std,;,int main( ),std,: :cout Hello, world!n;,C+,的标准库定义在,名字空间,std,之中,.,标准库定义在名字空间,std,#include ,#include ,using namespace,std; /,该编译指示引入,std,里的所有符号,/,使用该编译指示,using namespace std,;在,C+,标准类库中定义的名字在本程序中可以使用,/,否则,,iostream,string,等,c+,标准类就不可见了,编译就会出错。,10.2.3,标准模板库,STL,简介,Standard Template Library ( STL),包含常用算法和数据结构的通用库,STL,的核心内容是,3,个基本组件:,容器,算法,迭代器,STL,中的容器类,容器,(container),类是用来保存其它对象的,,STL,中定义了多种不同类型的容器,例如:,向量,vector,线性表,list,队列,queue,映射,map,集合,set,字符串,string,(,还有其他容器类,可以参考其他书籍或者查阅联机手册),常用算法,排序,sort( ),查找,find( ),替换,replace( ),合并,merge( ),反序,reverse( ),统计,count( ),其他等等算法,迭代器(,iterator,),迭代器是一种类似于指针的对象。可以使用迭代器来访问容器中的元素,就像我们使用指针来访问数组一样。,STL,中定义了五种迭代器:,随机访问迭代器,RandIter,双向迭代器,BiIter,前向迭代器,ForIter,输入迭代器,InIter,输出迭代器,OutIter,STL,的简单使用方法,在实际的,C+,面向对象程序设计中,,STL,库将起着举足轻重的作用。,STL,是一个非常庞大、复杂的类库,目前已经有不少专著介绍,STL,我们通过简单的实例介绍最基本的应用方法,10.2.4,标准模板库,STL,应用举例,向量,vector,线性表,list,队列,queue,映射,map,字符串,string,1.,向量,vector,向量vector类可用来支持动态数组,动态数组是指可以根据需要改变大小的数组。,可以很容易地声明一个vector类对象,例如:,vector iv;,vector cv(5);,vector cv(5,x);,vector iv2(iv);,vector,应用实例,/ Access a vector using an iterator.,#include ,#include ,using namespace std;,int,main( ),vector v; / create zero-length vector,int,i;,/ put values into a vector,for(i=0; i10; i+) v.push_back(A + i);,vector,应用实例(续),/ can access vector contents using subscripting,for(i=0; i10; i+),cout, vi ;,cout,endl,;,/ access via iterator,vector:,iterator,p = v.begin( );,while(p != v.end() ,cout, *p ;,p+;,return 0;,2.,线性表,list,线性表 list 类定义了双向的线性表, 又可称为双向链表。List类只支持顺序访问。,下面的C+程序通过实例化链表list类模板建立了一个保存字符的链表,接着使用类模板的排序方法sort( )进行排序,然后输出经过排序后的字符。,线性表,list,应用实例(续),/ Sort a list.,#include ,#include ,#include ,using namespace std;,int,main(),int,i;,list,lst,;,/ create a list of random characters,for(i=0; i10; i+),lst.push_back(A,+ (rand()%26);,线性表,list,应用实例(续),cout, Original contents: ;,list:,iterator,p =,lst.begin,();,while(p !=,lst.end,() ,cout, *p;,p+;,cout,endl,endl,;,/ sort the list,lst.sort,( );,线性表,list,应用实例(续),cout, Sorted contents: ;,p =,lst.begin,();,while(p !=,lst.end,() ,cout, *p;,p+;,return 0;,3.,队列,queue,队列(queue)是一个先进先出(FIFO: First In First Out)的数据结构,在程序设计中经常使用。,对一个队列常用的操作有,在队列尾增加一个元素、在队列头取一个元素以及测试队列是否为空、是否为满等操作。,队列,queue,的应用实例,Using queue class in the Standard C+ Library, Instantiate a queue for strings and demonstrate the following functions in main( ) to show that you know how to use this class:,queue:push( ),queue:pop( ),queue:empty( ),queue:front( ),queue:back( ),queue:size( ),#include ,#include ,#include ,using namespace,std,;,void main( ),queue,str_queue,;,str_queue.push(string1);,str_queue.push(string2);,str_queue.push(string3);,coutthe size of the queue is: ,str_queue.size,()endl;,coutthe front one ,str_queue.front,()endl;,coutthe back one ,str_queue.back,()endl;,str_queue.pop,( );,str_queue.pop,( );,str_queue.pop,( );,if (,str_queue.empty,( ),cout the queue is empty!endl;,4.,映射,map,映射map类定义了一个关联容器,并且在容器中使用唯一的关键字来映射相应的值。,map类对象是一系列关键字值的匹配对。,map的功能在于:只要知道了一个值的关键字,就可以找到这个值。,下面的实例程序通过实例化标准库中的map类模板映射建立了一些英文单词与其反义词的对应关系,利用这种对应系可以迅速查找到一个词的反义词。,映射,map,类,应用实例,/ A map of word opposites, using strings.,#include ,#include ,#include ,using namespace std;,int,main( ),int,i;,map m;,m.insert(pair(yes, no);,m.insert(pair(up, down);,m.insert(pair(left, right);,m.insert(pair(good, bad);,映射,map,类应用实例(续),string s;,cout, s;,map:,iterator,p;,p = m.find(s);,if(p != m.end(),cout,second;,else,cout, Word not in map.n;,return 0;,5.,字符串类,string,C+提供了两种处理字符串的方法:,以空字符0结尾的字符数组,容器类string类的对象(标准库中的string类),使用标准库中的string类的三个理由:,一致性,(字符串定义为一种数据类型),方便性,(可以使用标准的运算符),安全性,(不会出现数组越界错误),字符串类,string,应用实例,/ Demonstrate insert(), erase(), and replace().,#include ,#include ,using namespace std;,int,main(),string str1(This is a test);,string str2(ABCDEFG);,cout, Initial strings:n;,cout, str1: str1 ,endl,;,cout, str2: str2 nn;,字符串类,string,应用实例(续),/ demonstrate insert(),cout, Insert str2 into str1:n;,str1.insert(5, str2);,cout, str1 nn;,/ demonstrate erase(),cout, Remove 7 characters from str1:n;,str1.erase(5, 7);,cout, str1 nn;,字符串类,string,应用实例(续),/ demonstrate replace,cout, Replace 2 characters in str1 with str2:n;,str1.replace(5, 2, str2);,cout, str1 ,endl,;,return 0;,程序运行后的输出信息,Initial strings:,str1: This is a test,str2: ABCDEFG,Insert str2 into str1:,This,ABCDEFGis,a test,Remove 7 characters from str1:,This is a test,Replace 2 characters in str1 with str2:,This ABCDEFG a test,10.9,排序算法,sort,#include ,#include ,#include ,#include ,using namespace std;,void,load(vector,void,print(vector,);,const,int,SIZE=8;,int,main(), vector,v(SIZE,);,load(v,);,sort,(v.begin(),v.end,(); /,排序(利用标准库中的模板,sort( ),。),print(v,);,return 0;,10.9,排序算法,sort,(续),void,load(vector,& v), v0 = Japan;,v1 = Italy;,v2 = Spain;,v3 = Egypt;,v4 = Chile;,v5 = Zaire;,v6 = Nepal;,v7 = Kenya;,void,print(vector, v),for (,int,i=0; iSIZE; i+),cout,vi, ,endl,;,cout,endl,;,10.9,排序算法,sort,(续),输出结果如下:,Chile,Egypt,Italy,Japan,Kenya,Nepal,Spain,Zaire,标准库中的模板,sort( ),template ,void,sort(RandIter,start,RandIter,end);,template ,void,sort(RandIter,start,RandIter,end, Comp,cmpfn,);,The sort( ) algorithm sorts the range specified by start and end.,The second form allows you to specify a comparison function that determines when one element is less than another.,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!