《类库和C的标准模板库STL.pptx》由会员分享,可在线阅读,更多相关《类库和C的标准模板库STL.pptx(61页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第10章 类库和C+的标准模板库STL10.1 类库的概念10.2 C+的标准模板库STL第1页/共61页10.1 类库的概念1.1.1 什么是类库(class library)?1.1.2 如何分析、利用类库?1.1.3 类库的特点1.1.4 类库是面向对象的软件开发环境的核心第2页/共61页10.1.1 什么是类库?类库是类的集合,并且给出了多种类之间的关系描述。为了便于程序员的开发工作,系统提供了一批可供重用的代码。(源程序代码)具体表现为一组类,通过建立彼此间的继承关系形成类库,以类的形式提供给用户重用。第3页/共61页什么是类库?(续)在设计和实现面向对象的程序的时候,要用类和类库,
2、才能得到所需的对象,即类的实例。所以,类库是一种预定义的面向对象的程序库。第4页/共61页类库的例子C+Standard STL libraryMicrosoft Visual C+系统中提供的MFC类库。MFC Microsoft Foundation ClassBorland C+系统中提供的OWL类库。C+Builder 系统中提供的VCL类库。第5页/共61页类库为软件重用提供基础OOP提供的继承机制使得程序员可以在已有类的基础上定义自己需要的新类,从而实现了软件模块的重用。第6页/共61页程序员分工进一步细化在面向对象的程序设计范型之下,程序员的队伍可能要分为两种,它们都以类作为工作
3、对象 一个队伍主要是设计类和类库,另一个队伍主要是使用类来设计应用程序。分工细化就意味着进步第7页/共61页10.1.2 如何分析、利用类库?要想发挥面向对象方法的优势,程序员必须知道类库的组织情况。我们可以通过联机帮助或类库参考手册(类库工作手册)了解:软件开发系统提供的类库的类层次结构。可能需要用到的类及其父类的属性和方法。通过联机文档提供的例子学习有关类的使用方法。第8页/共61页衡量应用程序员能力的标准的变化结构化程序设计时代的标准:每天编写的源代码行数,程序结构清晰。面向对象程序设计时代的标准:衡量一个应用程序员的生产力,要看他是否知道如何来最好地发挥已有类库的功能,要看他有没有能力
4、将已有的类库与新问题紧密的匹配起来,还要看他不得不另外编写的代码是不是最少。第9页/共61页10.1.3 类库有什么特点1.通用性 2.可扩充性 3.概念性与层次性 4.灵活性 第10页/共61页通用性 基于重用的目的,选择具有广泛适用性的东西作为类库的内容,并经过全面的考虑,使之适用于较多的情况。第11页/共61页可扩充性 在软件开发过程中,可以添加新的类供以后使用。对已有的类库进行改进时,只要保持接口不变,修改不会引起外部(即应用系统)软件的变化。第12页/共61页概念性与层次性 类库中的每个类的概念要明确,易于理解,将具有某些共同性质的类作为基类。设计类要有一个明确的目标。一个好的类应该
5、是容易理解和使用的。第13页/共61页10.1.4 类库是面向对象的软件开发环境的核心1.OOP开发方法只有基于软件重用的思想,才能真正提高软件开发的效率和质量。2.类库为软件重用提供了基础,程序设计不必再从零开始。3.类库不同于传统的子程序库(函数库),它的性能大大优于子程序库。第14页/共61页10.2 C+的标准模板库STL10.2.1 名字空间namespace简介10.2.2 C+标准库的构成10.2.3 标准模板库STL简介10.2.4 标准模板库STL应用举例第15页/共61页10.2.1 名字空间namespace简介日常生活中人名相同引起的名字冲突;C+程序中出现相同的名字引
6、起的冲突:容器类库中有一个List类窗口类库中有一个List类如果一个程序中要同时使用这两个类库就会发生名字冲突第16页/共61页名字冲突的危害在同一个源文件(编译单元)中出现的名字冲突可以由编译器 compiler 检查出来:Redefined Symbols(ambiguous symbol)在不同编译单元(如目标文件)之间的名字冲突可能由链接器Linker检查出来:Identifier multiply defined也可能导致错误链接,从而产生运行时错误 runtime error。第17页/共61页名字冲突的原因C+中采用的是单一的全局名字空间(参见)。在这单一的空间中,如果有两个类
7、、两个变量或两个函数的名字完全相同,就会出现名字冲突。第18页/共61页作用域的概念 scope局部作用域 local scopes:块作用域函数作用域文件作用域全局作用域 global scopes全局标识符号:全局变量名、全局函数名、全局类型名等等全局名字在整个程序范围内有效第19页/共61页名字空间 namespace使用名字空间来划分全局名字空间可以避免名字冲突。解决的办法就是将程序中相同的名字定义在两个不同的名字空间中。第20页/共61页名字空间 namespace(续)名字空间就是为解决C+中的变量、函数等的名字冲突而服务的。程序规模越大,名字空间就越有用。The larger a
8、 program is,the more useful namespaces are to express logical separations of its parts.namespace又译作:命名空间、名称空间第21页/共61页名字空间的例子/两个在不同命名空间中定义的名字相同的变量namespace myown1string user_name=myown1;namespace myown2string user_name=myown2;名字空间的名字第22页/共61页int main()cout n Hello,myown1:user_name.and goodbye!n;cout
9、 n Hello,myown2:user_name.and goodbye!n;return 0;用命名空间限制符myown1访问变量user_name用命名空间限制符myown2访问变量user_name第23页/共61页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无需用命名空间限制符myo
10、wn1访问变量user_name第24页/共61页创建名字空间namespace namespacename/declaration and definitionsl可见,创建名字空间与定义一个类很相似,实际上类名就是一个名字空间的名字。第25页/共61页using namespace关键字 using 将一个名字空间变为可见,实际上只是将该名字空间的名字添加到当前名字空间中。命令using的作用域从其声明之处开始并持续到当前作用域scope结束。在使用一个名字空间时,并不会覆盖当前的名字空间。第26页/共61页using namespace 的有效范围int main()using name
11、space myown1;cout n Hello,user_name.and goodbye!n;using namespace myown2;cout n Hello,user_name .and goodbye!n;return 0;第27页/共61页名字空间小结 一、名字空间解决了C+的名字冲突问题 二、注意名字空间namespace的书写格式,和类class相似或相同。三、名字空间名必需是唯一的,否则必需在它们的外面再套上一层名字空间,亦即名字空间可以和类一样的嵌套使用 四、同名类在声明实例时必需加上名字空间作用域符“名字空间名:类名”五、不一定只有类才可加上名字空间的外套,其它如,
12、局部变量、函数等都可加上名字空间外套。第28页/共61页10.2.2 C+标准库的构成基本的运行库例如支持动态内存分配、运行时类型信息RTTIC语言的标准库标准模板库(STL)输入输出流类库(I/O Stream)和字符串数值计算库例如支持复数的计算第29页/共61页C+标准库名字空间#include using namespace std;int main()std:cout Hello,world!n;C+的标准库定义在名字空间 std之中.第30页/共61页标准库定义在名字空间std#include#include using namespace std;/该编译指示引入std 里的所有
13、符号/使用该编译指示using namespace std;在C+标准类库中定义的名字在本程序中可以使用/否则,iostream,string 等c+标准类就不可见了,编译就会出错。第31页/共61页10.2.3 标准模板库STL简介Standard Template Library(STL)包含常用算法和数据结构的通用库STL的核心内容是3个基本组件:容器算法迭代器第32页/共61页STL中的容器类容器(container)类是用来保存其它对象的,STL中定义了多种不同类型的容器,例如:向量 vector线性表 list 队列 queue映射 map集合 set字符串string(还有其他容
14、器类,可以参考其他书籍或者查阅联机手册)第33页/共61页常用算法排序 sort()查找 find()替换 replace()合并 merge()反序 reverse()统计 count()其他等等算法第34页/共61页迭代器(iterator)迭代器是一种类似于指针的对象。可以使用迭代器来访问容器中的元素,就像我们使用指针来访问数组一样。STL中定义了五种迭代器:随机访问迭代器 RandIter双向迭代器 BiIter前向迭代器 ForIter输入迭代器 InIter输出迭代器 OutIter第35页/共61页STL的简单使用方法在实际的C+面向对象程序设计中,STL库将起着举足轻重的作用。
15、STL是一个非常庞大、复杂的类库目前已经有不少专著介绍STL我们通过简单的实例介绍最基本的应用方法第36页/共61页10.2.4 标准模板库STL应用举例1.向量 vector2.线性表 list 3.队列 queue4.映射 map5.字符串string第37页/共61页1.向量 vector向量vector类可用来支持动态数组,动态数组是指可以根据需要改变大小的数组。可以很容易地声明一个vector类对象,例如:vector iv;vector cv(5);vector cv(5,x);vector iv2(iv);第38页/共61页vector应用实例/Access a vector u
16、sing 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);第39页/共61页vector应用实例(续)/can access vector contents using subscripting for(i=0;i10;i+)cout vi ;cout endl;/access via iterator vector:itera
17、tor p=v.begin();while(p!=v.end()cout *p ;p+;return 0;第40页/共61页2.线性表 list线性表 list 类定义了双向的线性表,又可称为双向链表。List类只支持顺序访问。下面的C+程序通过实例化链表list类模板建立了一个保存字符的链表,接着使用类模板的排序方法sort()进行排序,然后输出经过排序后的字符。第41页/共61页线性表list应用实例(续)/Sort a list.#include#include#include using namespace std;int main()int i;list lst;/create a
18、list of random characters for(i=0;i10;i+)lst.push_back(A+(rand()%26);第42页/共61页线性表list应用实例(续)cout Original contents:;list:iterator p=lst.begin();while(p!=lst.end()cout *p;p+;cout endl endl;/sort the list lst.sort();第43页/共61页线性表list应用实例(续)cout Sorted contents:;p=lst.begin();while(p!=lst.end()cout *p;p
19、+;return 0;第44页/共61页3.队列 queue队列(queue)是一个先进先出(FIFO:First In First Out)的数据结构,在程序设计中经常使用。对一个队列常用的操作有,在队列尾增加一个元素、在队列头取一个元素以及测试队列是否为空、是否为满等操作。第45页/共61页队列queue的应用实例Using queue class in the Standard C+Library,Instantiate a queue for strings and demonstrate the following functions in main()to show that yo
20、u know how to use this class:queue:push()queue:pop()queue:empty()queue:front()queue:back()queue:size()第46页/共61页#include#include#include using namespace std;void main()queue str_queue;str_queue.push(string1);str_queue.push(string2);str_queue.push(string3);第47页/共61页coutthe size of the queue is:str_que
21、ue.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;第48页/共61页4.映射 map映射map类定义了一个关联容器,并且在容器中使用唯一的关键字来映射相应的值。map类对象是一系列关键字值的匹配对。map的功能在于:只要知道了一个值的关键字,就可以找到这个值。下面的实例程
22、序通过实例化标准库中的map类模板映射建立了一些英文单词与其反义词的对应关系,利用这种对应系可以迅速查找到一个词的反义词。第49页/共61页映射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);第50页/共61页映射map类应用实例
23、(续)string s;cout s;map:iterator p;p=m.find(s);if(p!=m.end()cout Opposite:second;else cout Word not in map.n;return 0;第51页/共61页5.字符串类 stringC+提供了两种处理字符串的方法:以空字符0结尾的字符数组容器类string类的对象(标准库中的string类)使用标准库中的string类的三个理由:一致性(字符串定义为一种数据类型)方便性(可以使用标准的运算符)安全性(不会出现数组越界错误)第52页/共61页字符串类 string应用实例/Demonstrate in
24、sert(),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;第53页/共61页字符串类 string应用实例(续)/demonstrate insert()cout Insert str2 into str1:n;str1.insert(5,str2);cout str1 nn;/dem
25、onstrate erase()cout Remove 7 characters from str1:n;str1.erase(5,7);cout str1 nn;第54页/共61页字符串类 string应用实例(续)/demonstrate replace cout Replace 2 characters in str1 with str2:n;str1.replace(5,2,str2);cout str1 endl;return 0;第55页/共61页程序运行后的输出信息Initial strings:str1:This is a teststr2:ABCDEFGInsert str2
26、 into str1:This ABCDEFGis a testRemove 7 characters from str1:This is a testReplace 2 characters in str1 with str2:This ABCDEFG a test第56页/共61页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);sor
27、t(v.begin(),v.end();/排序(利用标准库中的模板sort()。)print(v);return 0;第57页/共61页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;第58页/共61页10.9 排序算法sort(续)输出结果如下:ChileEgyptItalyJapanKenyaNepa
28、lSpainZaire第59页/共61页标准库中的模板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.第60页/共61页感谢您的观看!第61页/共61页