16.4.5 容器种类(上:容器概念)

STL具有容器概念和容器类型。

概念是具有名称(如容器、序列容器、关联容器等)的通用类别;

容器类型是可用于创建具体容器对象的模板。

一起的11个容器类型分别是:

  1. deque
  2. list
  3. queue
  4. priority_queue
  5. stack
  6. vector
  7. map
  8. multimap
  9. set
  10. multiset
  11. bitset

C++11取消了bitset容器,将其视为独立的类别,新增了:

  1. forward_list
  2. unordered_map
  3. unordered_multimap
  4. unordered_set
  5. 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) 线性

 

 复杂度描述了执行操作所需的时间。从快到慢依次为:

  1. 编译时间
  2. 固定时间
  3. 线性时间

复杂度要求是STL特征,虽然实现细节可以隐藏,但性能规格应公开,以便程序员能够知道完成特定操作的计算

成本

 

posted @ 2020-08-22 19:19  孱陵  阅读(601)  评论(0编辑  收藏  举报