顺序容器类型:
vector 可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢
deque 双端队列。支持快速随机访问。在头尾位置插入/删除速度很快
list 双向列表。只支持双向顺序访问。在 list 中任何位置进行插入/删除操作速度都很快
forward_list 单向链表。只支持单向顺序访问。在链表任何位置进行插入/删除操作都很快
array 固定大小数组。支持快速随机访问。不能添加或删除元素
string 与 vector 相似的容器,但专门用于保存字符。随机访问快。在尾部插入/删除速度很快
容器操作(后面再提具体每个容器操作对元素的其他限制):
类型别名
iterator 此容器的迭代器类型
const_iterator 可以读取元素,但不能修改元素的迭代器类型
size_type 无符号整数类型,足够保存此种容器类型最大可能容器大小
difference_type 带符号整数类型,足够保存两个迭代器之间的距离
value_type 元素类型
reference 元素的左值类型,与 value_type& 含义相同
const_reference 元素的 const 左值类型,即 const value_type&
构造函数
C c; 默认构造函数,构造空容器
C c1(c2); 构造 c2 的拷贝 c1
C c(b, e); 构造 c,将迭代器 b 到 e 指定的范围内的元素拷贝到 c(array 不支持)
C c{a, b, c, d...} 列表初始化 c
赋值与 swap
c1 = c2; 将 c1 中的元素替换为 c2 中的元素
c1 = {a, b, c, d...} 将 c1 中的元素替换为列表中元素(不适用于 array)
a.swap(b); 交换 a 和 b 的元素
swap(a, b); 等价于 a.swap(b)
大小
c.size(); c 中元素的数目(不支持 forward_list)
c.max_size(); c 中可保存的最大数目的元素数目
c.empty(); 若 c 中存储了元素,返回 false,否则返回 true
添加/删除元素(不适用于 array)
注:在不同容器中,这些操作的接口都不同
c.insert(args); 将 args 中的元素拷贝进 c
c.emplace(inits); 使用 inits 构造 c 中的一个元素
c.erase(args); 删除 args 指定的元素
c.clear(); 删除 c 中所有元素,返回 void
关系运算符
==,!= 所有容器都支持
<,<=,>,>= 关系运算(无序关联容器不支持)
获取迭代器
c.begin(),c.end() 返回 c 的首元素和尾元素之后位置的迭代器
c.cbegin(),c.cend() 返回 const_iterator
反向容器的额外成员(不支持 forward_list)
reverse_iterator 按逆序寻址元素的迭代器
const_reverse_iterator 不能修改元素的逆序迭代器
c.rbegin(),c.rend() 返回指向 c 尾元素和首元素之前位置的迭代器
c.crbegin(),c.crend() 返回 const_reverse_iterator
虽然我们可以在容器中保存几乎任何类型,但某些容器操作对元素类型有自己的特殊要求。我们可以为不支持特定操作需求的类型定义容器,但这种情况下就只能使用那些没有特殊要求的容器操作了:
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 class no_default{//no_default 是一个没有默认构造函数的类型 6 int x; 7 public: 8 no_default(int a) : x(a){} 9 ~no_default(){} 10 }; 11 12 int main(void){ 13 int init = 1; 14 std::vector<no_default> v1(10, init);//正确,提供了元素初始化器(执行结果是v1中有10个1) 15 // std::vector<no_default> v2(10);//错误,必须提供一个元素初始化器 16 return 0; 17 }