容器,用来管理某类对象的集合。
图1 STL的容器种类
序列式容器(Sequence Containers)
STL内部预先定义好以下三个序列式容器:
l Vectors
l Deques
l Lists
此外,你也可以把strings和array当做一种序列式容器。
关联式容器(Associative Containers)
关联式容器依据特定的排序准则,自动为其元素排序。排序准则以函数形式呈现,用来比较元素值(value)或元素键(key)。
下面是STL中预先定义好的关联容器。
l Sets
l Multisets
l Maps
l Multimaps
容器适配器(Container Adapters)
l Stacks(堆栈)
Stack容器对元素采取LIFO(后进先出)管理策略。
l Queues(队列)
Queues容器对元素采取FIFO(先进先出)管理策略。
l Priority queues(带优先序的队列)
Priority Queues容器中的元素可以拥有不同的优先权。
容器的共通能力
STL容器的三个最核心的能力是:
1. 所有容器提供的都是“value”语意而非“reference语意”。
2. 总体而言,所有元素形成一个次序(order)。也就是说,你可以依相同次序一次或多次遍历每个元素。
3. 一般而言,各项操作并非绝对安全。调用者必须确保传给操作函数的参数符合需求。
其它STL容器
STL是个框架,除了提供标准容器,它也允许你使用其它数据结构作为容器。
可使用三种不同方法来实现容器的“STL化”:
The invasive approach(侵入式作法) |
直接提供STL容器所需接口。特别是诸如begin()和end()之类的常用函数。这种作法需要以某种特定方式编写容器,所以是侵入式的。 |
The noninvasive approach(非侵入式作法) |
由你撰写或提供特殊迭代器,作为算法和特殊容器间的界面。此一作法是非侵入式的,它所需要的只是“遍历容器所有元素”的能力——这是任何容器都能以某种形式展现的能力。 |
The wrapper approach(包装法) |
将上述两种方法加以组合,我们可以写一个外套类别(wrapper class)来包装任何数据结构,并显示出与STL容器相似的接口。 |