C标准模块库STL及其程序设计实用.pptx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《C标准模块库STL及其程序设计实用.pptx》由会员分享,可在线阅读,更多相关《C标准模块库STL及其程序设计实用.pptx(300页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 6.1.1 初识STL 简而言之,STL封装了C/C+的原始能力,再加上数据结构中讲的先进高效的算法,绑定成了一个简单实用的形式。可以将STL看作一个可扩充的框架,其中包含一些组件,如语言支持、诊断程序、通用工具、字符串、本地化、容器、迭代符、算法、数值量和输入/输出。其中,容器、迭代符、算法是STL的核心。第1页/共300页 6.1.2 STL和HP公司 STL是由HP公司的Alexander Stepanov和Meng Lee开发的,STL被期望成为保存和处理数据的一个标准方法。主要编译器销售商正开始将STL结合到其产品中。STL不只是作为一个次要的部分添加到世界上最流行的程序设计语言中
2、,它代表着一种革命性和能力。STL为C+程序设计语言带来一组成熟得使人惊奇的类属容器和算法,为C/C+增加了新的一面。第2页/共300页 6.1.3 大众化的STL 从类属类到模板,然后再到最好的跨平台、可移植的标准模板STL,是一个越来越方便程序员的过程。STL越来越大众化。第3页/共300页 6.1.4 STL总览 尽管STL的规模很大,并且其语法初看上去有些令人生畏,但实际上一旦理解其构造以及使用的元素,STL是很容易使用的。STL的核心是三个基础项,它们分别称为容器(Container)、算法(Algoithm)和迭代器(Iterator)。这些库一起工作,可以以一种可移植的格式产生常
3、用算法的解决方案,比如创建数组、元素插入/删除、排序和元素输出。STL甚至还进一步提供了内部清晰、无缝、高效的输入/输出流(Iostream)集成和异常处理。第4页/共300页 6.1.5 STL基本组件 在概念上,STL包含三个分开的算法问题求解工具,这三个最重要的部分是容器、算法和迭代器。容器是数据在内存中的组织方法,例如数组、堆栈、队列、链表或二叉树。然而,还有许多其他种类的容器,STL包括那些最有用的容器。STL容器是用模板类实现的,因此可以容易地定制它们以得到不同类型的容器。第5页/共300页 所有的容器有共同的管理成员函数,在其模板中定义insert()、erase()、begin
4、()、end()、size()、capacity()等,各容器有支持其自身需要的成员函数。算法是应用在容器上以各种方法处理其内容的行为或能力。例如,有对容器内容排序、复制、检索和合并的算法。在STL中,算法是由模板函数表现的,这些函数不是容器类的成员函数,而是独立的函数。的确,STL的令人吃惊的特点之一就是其算法如此通用,不仅可以将其用于STL容器,而且可以用于普通的C+数组或任何其他应用程序指定的容器。第6页/共300页 一组标准的算法为容器中的对象提供了检索、复制、排序、变换和数值操作功能。同一算法可用来为所有的对象类型的所有容器执行某一项特别的操作。一旦选定一种容器类型和数据行为,那么下
5、面惟一要做的是用迭代器使其相互作用。可以把迭代器看作一个指向容器中元素的普通指针,可以像递增一个指针那样递增迭代器,使其依次指向容器中每一个后继的元素。迭代器是STL的一个关键部分,因为它将算法和容器连在一起。第7页/共300页 6.1.6 其他STL组件 除了容器、算法和迭代器之外,STL还定义了另外几种组件:(1)分配算符:为单个容器管理内存分配。(2)谓词:它们在本质上是一元或二元的,即其作用于一个或两个操作数并总是返回“真”或“假”。(3)比较函数:一种独特的二元谓词,比较两个元素并只在第一个参数小于第二个时返回“真”。(4)函数对象:包括加、减、乘、除、取模、取反、等于、不等于、大于
6、、大于或等于、小于、小于或等于、逻辑与、逻辑或以及逻辑非。第8页/共300页 6.1.7 完整的STL程序包 现将STL的结构组件在逻辑上归纳为以下3类。(1)STL头文件可以分成三个主要的组织概念:容器是支持普通数据组织方法的模板类,包括、和。算 法 是 对 对 象 序 列 执 行 普 通 操 作 的 模 板 函 数,包 括、和。迭代器是把算法和容器粘在一起的黏合剂,包括、和。第9页/共300页(2)输入/输出包括以下各项内容的组件:输入/输出流的向前声明;预定义输入/输出流对象;基输入/输出流类;流缓冲;流格式和操纵器、和;字符串流;文件流。(3)其余标准C+头文件包括语言支持、诊断、字符
7、串、文化语言等组件。第10页/共300页 语言支持包括:在整个库中使用的普通类型定义的组件;预定义类型、和的特征;支持C+程序开始和结束的函数;对动态内存管理的支持;对动态类型标识符的支持;对异常处理的支持;其他运行时的支持、和。第11页/共300页 诊断包括以下各项内容的组件:报告几种异常情况;用文件证明程序断言;错误数字代码的全局变量。字符串包括以下各项内容的组件:字符串类;以NULL结尾的顺序工具、和。文化语言组件包括字符分类和字符串校对,数字、货币和日期/时间的格式 和 分 析,以 及 消 息 检 索 的 国 际 化 支 持,这 可 以 使 用 和组件。第12页/共300页6.2 ve
8、ctors 6.2.1 vector程序实例 让我们先看一个具体的例子,以此对容器、迭代器和算法有一些感性的认识,然后再逐步介绍STL。#include#include#include 第13页/共300页#include#include using namespace std;int main()vector ivec;cout size=ivec.size()endl;ivec.push_back(1);ivec.push_back(5);第14页/共300页ivec.push_back(9);ivec.push_back(3);ivec.push_back(7);cout size=iv
9、ec.size()endl;vector:iterator ite;for(ite=ivec.begin();ite!=ivec.end();+ite)cout *ite ;cout endl;第15页/共300页ite=find(ivec.begin(),ivec.end(),9);if(ite!=0)ivec.insert(ite,11);cout size=ivec.size()endl;cout *ite ;for(ite=ivec.begin();ite!=ivec.end();+ite)cout *ite ;cout endl;第16页/共300页ite=find(ivec.beg
10、in(),ivec.end(),3);if(ite!=0)cout *(ivec.erase(ite)endl;for(ite=ivec.begin();ite!=ivec.end();+ite)cout *ite ;cout endl;sort(ivec.begin(),ivec.end(),greater();for(ite=ivec.begin();ite!=ivec.end();+ite)cout *ite ;第17页/共300页cout endl;return 0;程序的输出结果为:size=0size=51 5 9 3 7size=611 1 5 11 9 3 771 5 11 9
11、 711 9 7 5 1第18页/共300页 STL的vector是一个简单的容器。在计算中,vector对应数组。vector表示一段连续的内存区域,每个元素被顺序存储在这段内存中。对vector的随机访问效率很高,因为每次访问离vector的起始处的位移都是固定的。但是,在不是vector末尾的任意位置插入或删除元素,效率很低。由此可见,vector类提供了与数组类似的操作,即可以创建vector对象,将一个vector对象赋给另一个vector对象,并使用 操作符来访问vector元素。要使类成为通用的,应将它设计成模板类。这正是STL的工作,即在头文件vector中定义了一个vecto
12、r模板。第19页/共300页 6.2.2 初始化 要创建vector模板对象,可用通常的表示法来指出要使用的类型。在6.2.1节的程序中创建了int类型的 vector对象ivec:vector ivec;现在我们有了一个vector容器,可以使用它来装东西了。vector的成员函数push_back()把一个对象放到一个vector对象的后面。现在,对象ivec中有了5个元素,它们是1、5、9、3、7。第20页/共300页另外,vector模板使用动态内存分配,因此可以用参数来创建vector对象,例如:#include#include using namespace std;vector
13、ivec(5);/有5个整型元素的向量vector svec(24,tiger);/有24个字符串的向量第21页/共300页 各种STL容器模板都要接受一个可选的模板参数,该参数用于指定使用哪个分配器对象来管理内存。例如,vector模板的开头与以下代码类似:template class T,class Allocator class vector.;如 果 省 略 该 模 板 参 数 的 值,则 容 器 模 板 将 默 认 使 用allocator类。这个类以标准方式使用new和delete。第22页/共300页 6.2.3 vector容器的方法 所有的STL容器都提供了一些基本的方法,其
14、中包括:size()返回容器中元素的数目;swap()交换两个容器的内容;begin()返回一个指向容器中第一个元素的迭代器;end()返回一个表示超过容器尾的迭代器。但是,并非所有的STL容器都具有方法push_back(),稍后我们还会提及。什么是迭代器呢?简单地说,它是一个广义指针。事实上,它可以是指针,也可以是一个可对其执行类似指针操作的对象(如operator*()和operator+()。第23页/共300页 对指向容器的指针进行广义化,使得STL能够为各种不同的容器类(包括那些简单指针无法处理的类)提供统一的接口。每个容器类都定义了一个合适的迭代器,该迭代器的类型是一个名为ite
15、rator的typedef,其作用域为整个类。要使用迭代器,必须包含头文件。在6.2.1节中的程序中为ivec声明了一个int类型的迭代器:vector:iterator ite;正如在程序中所见到的,迭代器的行为就像指针。第24页/共300页 注意:容器的end()函数会返回一个指向容器结束点的iterator。结束点在最后一个元素之后,程序运行到此就停止操作,所有的STL容器都要这样做。这样的迭代器又称作逾尾(past-the-end)迭代器。容器的begin()和end()函数如图6-1所示。第25页/共300页图6-1 容器的begin()和end()函数 第26页/共300页 由图6
16、-1可以看出,begin()和end()形成了一个半开区域,从第一个元素开始,到最后一个元素的下一个位置结束。半开区域有以下优点:(1)为访问元素时的循环结束时机提供了一个简单的判断依据。只要尚未达到end(),循环就可以继续进行下去。(2)不必对空区间采取特殊处理手法。空区间begin()就等于end()。在6.2.1节的程序中,每一次执行for循环,都重复引用ite得到我们打印的容器中的元素。第27页/共300页 还有一个erase方法,它用于删除vector中给定区间的元素。它接受两个迭代器参数,这些参数定义了要删除的区间。Insert()方法的功能与erase()方法相反。它接受两个参
17、数,第一个参数指定了新元素的插入位置,第二个参数定义了被插入的元素;或者接受3个参数,第一个参数指定了新元素的插入位置,第二个参数和第三个参数定义了被插入区间,该区间通常是另一个对象的一部分。例如:第28页/共300页 例如:vector one;vector two;one.insert(one.begin(),two.begin()+1,two.end();将对象two中除第一个元素外的所有元素插入到one的第一个元素的前面。第29页/共300页 6.2.4 对vector可执行的其他操作 程序员通常要对数组执行很多操作,如搜索、排序和随机排序等。vector模板类并没有包含执行这些常见操
18、作的方法。STL从更广泛的角度定义了非成员函数来执行这些操作,即不是为每个容器类定义find()成员函数,而是定义了一个适用于所有容器类的非成员函数find()。这种设计理念省去了大量重复的工作,例如,假设有8个容器类,需要支持10种操作,如果每个类都有自己的成员函数,第30页/共300页 则需要定义80个成员函数,但采用STL方式时,只需定义10个非成员函数即可。在定义新的容器类时,只要遵循正确的指导思想,则它也可以使用已有的非成员函数来执行查找、排序等操作。6.2.1节的程序中使用了具有代表性的STL算法:sort()。sort()算法要求容器支持随机访问。该算法有两个版本,第一个版本接受
19、两个定义区间的迭代器参数,并使用为存储在容器中的类型元素定义的“”操作符,对区间中元素进行操作。第31页/共300页 例如,执行代码 sort(ivec.begin(),ivec.end();将按升序对ivec的元素进行排序,排序使用内置的“”操作符对值进行比较。在第二个版本中,用户可以使用已定义的能够处理该类型对象的函数对象(或指向函数的指针),返回值可转换为bool的false。就如同在6.2.1节的程序中,sort()接受3个参数,前两个参数是指向区间的迭代器,最后一个参数就是要使用的函数对象(或指向函数的指针):第32页/共300页 sort(ivec.begin(),ivec.end
20、(),greater();该语句的执行结果是将ivec中的对象按升序排列。通过前面的介绍,我们对STL有了初步的了解,STL旨在编写独立于数据类型的代码。在C+中,完成通用程序的工具是模板。当然,模板使得能够按通用类型定义函数或类,而STL通过通用算法使得完成计算更方便。第33页/共300页6.3 STL 与 模 板 STL出色地利用了指针、函数重载和运算符重载,另外,它还十分依赖于模板。在查看一个STL实例之前,先看下面这一简明易懂的C代码段,它使用了#define和连接符(#)预处理语句定义了一个二叉树节点。第34页/共300页C example#define BINARY_TREE(t)
21、typedef struct _tree_#t t data;struct _tree_#t*left;struct _tree_#t*right;BINARY_TREE_#;第35页/共300页 应注意预处理器是如何用用户选择的数据类型替换参数t的,例如:BINARY_TREE(int);BINARY_TREE(float);BINARY_TREE(my_structure);然后,程序完全重定义了这一节点。例如,对于int数据类型,二叉树节点的定义将变为:typedef struct_tree_int int data;第36页/共300页 struct_tree_int *left;st
22、ruct_tree_int *right;BINARY_TREE_int;这只是个有关C/C+语言提供的固有模块性的例子。上面的几个例子在C中都是合法的,不需要附加C+的任何语法。第37页/共300页 尽管上例解决了节点能存放不同类型数据的问题,但是仍然有缺点:与可以产生宏的内联(inline)函数不同,#define定义的宏没有错误检查能力。#define语句所做的是由C/C+的两次编译之一严格地完成字符串查找和替换操作。显然,为了产生可靠和可移植的代码,必须有一些其他的方法,以产生可靠的定义,这一方法就是C+模板。第38页/共300页 6.3.1 template关键字 模板是在ANSI/
23、ISO C+标准中的高级特性之一。正如Bjarne Stroustrup(C+的作者之一)说的那样,“模板被认为是设计适当的容器类所必需的”。对许多人来说,C+最大的一个问题是缺少可扩展的标准库。为产生这样的库,最大的问题是C+没有提供一个充分通用的工具用于定义诸如列表、向量和联合数组这样的“容器类”。将模板结合到C+语言中直接导致了STL的出现,STL是使用模板类和模板函数的容器类和算法的标准化库。第39页/共300页 6.3.2 模板语法 作为一个程序员,一定要理解函数和函数调用的概念。函数包含一个模块化设计、可重复使用和求解单一问题的算法。在执行调用程序的算法时,函数调用为正在执行的程序
24、传递需要的实际参数。C+模板以完全新的方式使用参数:创建新函数和类。与为函数传递参数不同,模板是在编译而不是运行时创建这些新函数和类的。第40页/共300页 模板的语法为:template declaration 程序员在关键字template和参数列表(argument_list)之后提供模板声明。在此处,定义参数化的类或函数的版本。在使用模板时,由C+编译器根据传递给模板的参数负责产生类或函数的不同版本。第41页/共300页 6.3.3 模板函数 要理解模板如何在STL中发挥作用,需要知道两种类型的模板:类模板和函数模板。函数模板产生函数,而类模板产生类。下面的程序定义了一个求任何数据类型
25、的数据平方的函数模板。template Type squareIt(Type x)return x*x;/函数模板第42页/共300页 可以为函数模板squareIt()传递任何合适的数据类型,例如:void main(void)cout The square of the integer 9 is:squareIt(9);cout The square of the unsigned int 255 is:squareIt(255u);cout The square of the float 10 is:squareIt(10.0);/.第43页/共300页 这三条语句使编译器在编译时产生如
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 标准 模块 STL 及其 程序设计 实用
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内