一般来说, 每个容器都定义在一个与类型名同名的头文件中. 例如: 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为空 |