3、顺序容器

所谓序列式容器,其中的元素都可序(ordered),但未必有序(sorted)。array 为 C++ 语言内置的序列容器,STL 另外提供 vector、list、deque、stack、queue 等等顺序式容器。它们的差别在于访问元素的方式,以及添加或删除元素相关操作的运行代价。
标准库还提供了三种容器适配器(adapter),所谓适配器是根据原始的容器类型所提供的操作,通过定义新的操作接口,来适应基础的容器类型。顺序容器适配器包括 stack、queue、priority_queue 等序列式容器。其中 stack 和 queue 由于只是将 deque 改头换面而成,技术上被归类为一种适配器,priority_queue 是有优先级管理的队列。

1、顺序容器的构造函数

顺序容器主要介绍 3 种,即 vector、list、deque,相应的头文件为:

 #include<vector> #include<list> #include<deque>

以下介绍的函数适用于所有顺序容器(vector、list、deque),故在下文不再介绍。

C<T> c; 

创建一个名为 c 的空容器。C 是容器类型名,如 vector,list,T 是元素类型,如 int 或 string。适用于所有容器。

C<T> c(c2);

创建容器 c2 的副本 c;c 和 c2 必须具有相同的容器类型,并存放相同类型的元素。适用于所有容器。

C<T> c(b, e);

创建 c,其元素是迭代器 b 和 e 标示的范围内元素的副本。适用于所有容器。

C<T> c(n, t);

用 n 个值为 t 的元素创建容器 c,其中值 t 必须是容器类型 C 的元素类型的值,或者是可转换为该类型的值。

C<T> c(n);  

只适用于顺序容器,创建有 n 个值初始化元素的容器 c。

2、顺序容器的一些其他操作

  • 将一个容器初始化为另一个容器的副本
    当不使用默认构造函数,而是用其他构造函数初始化顺序容器时,必须指出该容器有多少个元素,并提供这些元素的初值。同时指定元素个数和初值的一个方法是将新创建的容器初始化为一个同类型的已存在容器的副本。将一个容器复制给另一个容器时,类型必须匹配:容器类型和元素类型都必须相同。
  • 初始化为一段元素的副本
    尽管不能直接将一种容器内的元素复制给另一种容器,但是可以使用一对迭代器间接实现该功能。使用迭代器时,不要求容器类型相同,容器内的元素类型也可以不相同,只要他们相互兼容。迭代器标记了要复制的元素范围,这些元素用于初始化新容器的元素。迭代器标记出要复制的第一个元素和最后一个元素。采用这种初始化形式可复制不能直接复制的容器。
  • 分配和初始化指定数目的元素
    创建顺序容器时,可显式指定容器大小和一个(可选的)元素初始化式。容器大小可以是常量或非常量表达式,元素初始化则必须是可用于初始化其元素类型的对象的值。 不提供元素初始化式时,标准库将为该容器实现值初始化。采用这种类型的初始化,元素类型必须是内置或复合类型,或者是提供了默认构造函数的类类型。如果元素类型没有默认构造函数,则必须显式指定其元素初始化式。接受容器大小做形参的构造函数只适用于顺序容器,而关联容器不支持这种初始化。

3、顺序容器的一些其他函数

201608242311407171.png
20160824231215827.png

assign 操作首先删除容器内所有的元素,再将参数所指定的新元素插入到容器中。swap 操作不会删除或插入任何元素,而且保证在常量时间内实现交换。由于容器内没有移动任何元素,因此迭代器不会失效。但要注意这些迭代器指向了另一个容器中的元素。