《C++标准程序库》学习笔记(二)容器

时间:2022-07-06 19:48:11

容器,用来管理某类对象的集合。

《C++标准程序库》学习笔记(二)容器

图1 STL的容器种类


序列式容器(Sequence Containers

STL内部预先定义好以下三个序列式容器:

l Vectors

l Deques

l Lists

此外,你也可以把stringsarray当做一种序列式容器。


关联式容器(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容器相似的接口。