容器库概览

  一般来说, 每个容器都定义在一个与类型名同名的头文件中. 例如: deque定义在头文件deque中, list定义在头文件list中.

对容器可保存类型的限制
  顺序容器几乎可以保存任意类型的元素. 特别地, 可以定义一个容器, 其元素类型是另一个容器. 例如:

1
vector<vector<string>> lines; //vector的vecotr

  此处的lines是一个vecotr, 其元素类型是string的vector.

  虽然容器可以保存几乎任意类型的元素, 但是某些容器对元素类型自己特殊的要求. 例如: 顺序容器的一个版本接受容器大小的参数, 它可以直接使用元素类型的默认构造函数.

1
vector<int> ivec(); //也可以不指定容器大小, vector<int> ivec;

  但是, 某些类型没有构造函数, 因此在构造保存这类型的容器时, 不能只给它一个参数数目的参数. 例如:

1
2
3
//假定noDefault是一个没有默认构造函数的类型
vector<noDefault> ivec(10, init); //正确, 提供了元素的初始化器
vector<noDefault> ivec(10); //错误, 必须提供一个元素的初始化器

容器操作

类型别名
iterator 此容器为迭代器类型
const_iterator 可以读取元素, 但是不能修改元素的迭代器类型
size_type 无符号整数类型, 足够保存此容器类型最大的可能容器的大小
difference_type 带符号整数类型, 足够保存两个迭代器之间的距离
value_type 元素类型
reference 元素的左值类型, 与value_type&类型相同
const_reference 元素的左值类型(即, const value_type&)
构造函数
C c; 默认构造函数,构造一个空容器
C c1(c2) 构造C2的拷贝c1
C c(b, e) 构造c, 将迭代器b和e指定的范围内的元素拷贝到c
C c{a, b, c, …} 列表初始化c
赋值与swap
c1 = c2 将c1中的元素替换为c2中的元素
c1 = {a, b, c,…} 将c1中的元素替换为列表中的元素(不适用于array)
a.swap(b) 交换a和b的元素
swap(a, b) 与a.swap(b)等价
大小
c.size() c中元素的数目, 不支持foeward_list
c.max_size() c可保存元素的最大数目, c的容量
c.empty() 返回bool值, false非空, true为空