16.4.5 容器种类(上:容器概念)
STL具有容器概念和容器类型。
概念是具有名称(如容器、序列容器、关联容器等)的通用类别;
容器类型是可用于创建具体容器对象的模板。
一起的11个容器类型分别是:
- deque
- list
- queue
- priority_queue
- stack
- vector
- map
- multimap
- set
- multiset
- bitset
C++11取消了bitset容器,将其视为独立的类别,新增了:
- forward_list
- unordered_map
- unordered_multimap
- unordered_set
- unordered_multiset
没有与基本容器概念对应的类型,但概念描述了所有容器类都通用的元素。
它是一个概念化的抽象基类——说它概念化,是因为容器类并不真正使用继承机制。
存储在容器中的数据为容器所有,这意味着当容器过期时,存储在容器中的数据也将过期。
不能将任意类型的对象存储在容器中,具体的说,类型必须是可复制构造的和可赋值的(没有将复制构造函数
和赋值运算符声明为私有的和保护的,则也满足此要求)。
所有的容器都提供某些特征和操作。
一些基本的容器特征:
表达式 | 返回类型 | 说明 | 复杂度 |
X::iterator | 指向T的迭代器类型 | 满足正向迭代器要求的任何迭代器 | 编译时间 |
X::value_type | T | T的类型 | 编译时间 |
X u; | 创建一个名为u的空容器 | 固定 | |
X(); | 创建一个匿名的空容器 | 固定 | |
X u(a); | 调用复制构造函数后u==a | 线性 | |
X u = a; | 作用同X u(a); | 线性 | |
r = a; | X& | 调用赋值运算符后r==a | 线性 |
(&a)->~X() | void | 对容器中每一个元素应用析构函数 | 线性 |
a.begin() | 迭代器 | 返回指向容器第一个元素的迭代器 | 固定 |
a.end() | 迭代器 | 返回超尾值迭代器 | 固定 |
a.size() | 无符号整数 | 返回元素个数,等价于a.end()-a.begin() | 固定 |
a.swap(b) | void | 交换a和b的内容 | 固定 |
a == b | 可转换为bool |
如果a和b的长度相同,且a中每个元素都等于(==为真)b中 相应的元素,则为真 |
线性 |
a != b | 可转换为bool | 返回!(a==b) | 线性 |
复杂度描述了执行操作所需的时间。从快到慢依次为:
- 编译时间
- 固定时间
- 线性时间
复杂度要求是STL特征,虽然实现细节可以隐藏,但性能规格应公开,以便程序员能够知道完成特定操作的计算
成本