一、STL简介
1、STL(Standard Template Library,标准模板库)是C++标准库最主要和最重要的组成部分。其重要作用在于:
(1)它可以用来创建动态增长和减小的数据结构;
(2)它是类型无关的,因此具有很高的可复用性;
(3)它在编译时而不是运行时进行数据类型检查,保证了类型安全;
(4)它是平台无关的,因此保证了最大的可移植性;
(5)它还可用于基本数据类型,包括指针和引用,这对那些必须使用类层次结构来构造应用程序的语言来说是没法比的。
2、STL是一个标准规范,只定义了上层访问接口和组件间一般规则,而没有定义组件底层的实现方式:
3、STL组件:
4、 STL头文件:
(1)容器类:
(2)泛型算法:<algorithm>,<utility>
(3)迭代器:<iterator>
(4)数学运算库:
(5)通用工具:
(6)其他:
5、容器设计原理——容器就是 能够容纳其他对象作为其元素 的对象。
6、STL容器设计模型:
7、存储方式和访问方式:
(1)向量(vector)和链表(linked list)是两种最基本的动态结构,也是STL中两种最基本的容器,分别对应动态数组和链接表结构,同时它们分别代表了内存中同类型批量数据存放的两种基本方式:连续存储——随机访问,随机存储(不连续存储)——顺序访问。
8、顺序容器和关联式容器的比较:
9、存储空间重分配问题:
(1)在创建一个容器时能够预先估计出它可能存放的最大元素数目,预先分配足够数量的存储空间;
(2)尽量在容器的尾部执行插入操作,因为这里的插入操作效率最高。
10、对象作为STL容器元素需要满足的条件:
11、迭代器——STL中容器元素对象的位置指示器(可以理解为一种泛型指针或通用指针,但切不可把迭代器与void*和基类指针这样的通用指针混淆——指针代表真正的内存地址,即对象在内存中的存储位置;而迭代器则代表元素在容器中的相对位置)
简而言之,迭代器是为了降低容器和泛型算法之间的耦合性而设计的,泛型算法的参数不是容器,而是迭代器。
12、STL迭代器分为5个类别:
(1):
(2):
(3):
13、迭代器失效及其危险:
14、"容量","容器"和"有效元素"
注意:
(1)除了调用容器的某些方法可以改变容器的大小(注意,是容器,不是容量;容器大小存放着有效元素。)外,在容器外部没有任何方法可以做到这一点。因此如果想使用迭代器在冗余容量(冗余容量不属于容器)的空间上通过赋值来给容器增加元素,结果一定会让你失望。如下程序:
(2)也可以使用resize改变容器大小:
(3)尽量不要在遍历容器的过程中对容器进行插入元素、删除元素等修改操作,这和不要在for循环中修改计数器是一个道理,特别是连续存储的容器中。因为这些操作会使一些迭代器失效,特别是当前迭代器,这在效果上等价于修改了循环计数器。
(4)修改容器和修改容器中的元素对象的值是两码事。
15、存储分配器
16、适配器:
(1)容器适配器:
STL定义的迭代器适配器并不都是像容器适配器那样去改变另一个迭代器的接口,而是具有特殊的设计和特殊的用途。(插入式迭代器,输出流迭代器,输入流迭代器,反向迭代器)。函数对象及其迭代器比较复杂,这里不讨论。
17、泛型算法:(泛型算法<——>迭代器<——>容器)
(1)概念:
(2)泛型算法参数:
18、特殊容器:
(1)string类
(2)bitset并非set
(3)
19、空容器和容器元素判断
(1)由于容器的独特存储机制,使得容器可以是空的,而不像组那样不能为空。可以使用empty()方法来检查。
从容器中删除元素前一定要检查该元素是否属于该容器:
注意:
容器可以为空,容器为空的时候,容器对象依然存在,只不过容器里面的元素对象个数为0;
但数组不可为空,数组为空时,数组对象便不再存在了。
20、STL容器特征总结:
21、推荐阅读:
(5)本博客摘自《高质量程序设计指南——C++/C语言,第三版》
(6)C++模板详解
结语:参观飞机工厂不能让你学到流体力学,也不能让你学会开飞机。然而如果你会开飞机又懂流体力学,参观飞机工厂可以带给你最大的乐趣和价值。