定义
从程序员的角度来看,STL 是由一些可适应不同需求的集合类和一些能够在这些数据集合上运作的算法组成。
组成
STL = 容器 + 迭代器 + 算法。
- 容器
用于管理某类对象的集合。
每一种容器都有其优点或缺点,因此为应对不同需求,STL 准备了不同的容器类型。 - 迭代器
用来在一个对象集合内遍历元素,而且这个对象集合可以是整个容器,也可以是容器的一部分。
迭代器的优点在于:为所有各式各样的容器提供了一组很小的共通接口。 - 算法
用于处理集合内的元素。
出于不同的目的使用算法进行查找、修改或使用集合内的元素。
通过迭代器的协助,我们可以仅撰写一次算法,就可将其应用到任何容器。
容器
- 序列式容器
这是一种有序集合,元素位置取决于插入时机和插入位置。
序列式容器通常是对 数组/链表 的封装。 - 关联式容器
这是一种已排序集合,元素位置取决于元素值和给定的排序规则。
关联式容器通常是对 自平衡二叉树 的封装。 - 无序容器
这是一种无序集合,元素位置无关紧要,重要的是判定某个特定元素是否位于此集合中。
无序容器通常是对 哈希表 的封装。 - 其他容器
这类容器没有具体的定义,通常包括 string、c-style array、用户自定义容器。 - 容器适配器
它们也是预定义的容器,提供一定限度的接口,用于应对特殊需求,而且这些容器是根据普通容器实现而成。
区分 array 和 c-style array:
- array 属于序列式容器,是对普通数组的封装。
- c-style array 不属于容器,就是普通数组,但是可以使用 STL 中的算法 (所以勉强将其归入 “其他容器” 这一类)。
迭代器
迭代器是一个 “可遍历 STL 容器全部或部分元素” 的对象,其表示的是容器中的某一具体位置。
所有容器类都提供一些基本的成员函数,使我们得以取得迭代器并以之遍历所有元素。
在这里列举一下常见的此类成员函数 (后面就不用介绍了!!):
begin()
返回一个迭代器,指向容器第一个元素。end
返回一个迭代器,指向容器最后一个元素的下一个位置 (也称为容器终点)。cbegin()
返回一个常量迭代器,指向容器第一个元素。cend
返回一个常量迭代器,指向容器最后一个元素的下一个位置 (也称为容器终点)。rbegin()
返回一个迭代器,指向逆向容器第一个元素。rend
返回一个迭代器,指向逆向容器最后一个元素的下一个位置 (也称为逆向容器终点)。crbegin()
返回一个常量迭代器,指向逆向容器第一个元素。crend()
返回一个常量迭代器,指向逆向容器最后一个元素的下一个位置 (也称为逆向容器终点)。
逆向容器:将原容器元素位置翻转即可得到。
假定原容器元素序列为:1,2,3,4,5
逆向容器元素序列便为: 5,4,3,2,1
算法
算法是一种搭配迭代器使用,用于处理容器中元素的全局函数。
算法涉及众多,但是基本上使用容器自身方法即可解决。