一个容器就是一些特定类型对象的集合数组
以下图所示 数组是一个大小固定的数据结构,支持高效的随机访问,时间复杂度为O(1),可是插入与删除等操做比较低效,时间复杂度为O(n),须要作大量的数据搬移工做。所以该容器支持快速随机访问,不支持添加或删除元素。数据结构
下图为一个单链表,与数组相反,它并不须要一块连续的内存空间,它经过“指针”将一组零散的内存块串联起来使用,链表的特色为随机访问复杂度高,时间复杂度为O(n),可是插入与删除操做比较高效,时间复杂度为O(1)。函数
所以只支持单向顺序访问,在链表任何位置进行插入删除操做都很快。spa
下图为一个双向链表,与单向链表相似,只是在每一个节点多了一个前驱指针,因此该链表支持双向遍历。指针
所以该容器支持双向顺序访问,在链表任何位置进行插入删除操做都很快。对象
下图为单向队列的数据结构,队列跟栈同样,也是一种抽象的数据结构。它具备先进先出的特性,支持在队尾插入元素,在队头删除元素。deque为双向队列的顺序容器,顾名思义,双向队列的不一样之处在于队头也是队尾,队尾也是队头。blog
所以deque这种容器支持快速随机访问,在头尾位置插入/删除速度很快。队列
vector其实也是一个数组结构,只不过通过对数组内存空间的管理,使得vector成为了一个动态的数组结构。内存
所以vector为可变大小数组,支持快速随机访问,在尾部以外的位置插入或删除元素可能很慢。string
与vector相似的容器,但专门用来保存字符。随机访问快。在尾部插入删除速度快。
除非有很好的理由使用其余容器,不然应使用vector。
若是程序有不少小元素,且空间额外开销很重要,则不要使用链表。由于链表每一个节点都会至少有一个后继指针,所以会占用不少额外空间。
若是程序要求随机访问元素,则使用数组(vector)或队列(deque)。string也支持随机访问,可是该容器专门用于保存字符,array则是由于该数组为固定大小数组。
若是程序要求在容器的中间插入或删除元素,应使用链表。
若是程序要求在容器的头尾插入或删除元素,但不在中间插入,则使用队列。
若是程序要求只有在读取输入时须要在容器中插入元素,随后须要随机访问元素,则
首先肯定真的须要中间插入元素,当处理输入数据时,一般能够很容易的在vector容器末追加数据,再调用标准库中的sort函数来对容器中的元素进行重排,以免中间插入操做
若是必须在中间位置插入元素,则在输入阶段考虑list,一旦输入完成,将list中的数据拷贝到另外一个vector中。
构造函数 | |
---|---|
C c; | 默认构造函数,构造空容器(array) |
C c1(c2); | 构造 c2 的拷贝 c1 |
C c(b,e); | 构造 c ,将迭代器 b 和 e指定的范围内的元素拷贝到c |
C c{a,b,c,...} |
赋值与swap | |
---|---|
c1=c2; | 将 c1 中的元素替换为 c2 中的元素 |
c1=(a,b,c...); | 将 c1 中的元素替换为列表中元素(除array) |
a.swap(b); | 交换 a 和 b 的元素,swap一般比c2从c1拷贝元素快得多 |
swap(a,b); | 与 a.swap 等价 |
assign操做 | 不适用于关联容器和array |
seq.assign(b,e); | 将 seq 中的元素替换为迭代器 b 和 e 所表示的范围中的元素。迭代器 b 和 e 不能指向seq中的元素 |
seq.assign(i1); | 将seq中的元素替换为初始化列表 i1 中的元素 |
seq.assign(n,t); | 将 seq 中的元素替换为 n 个值为 t 的元素 |
大小 | |
---|---|
c.size(); | c中元素的数目(不支持forward_list) |
c.max_size(); | c可保存的最大元素数目 |
c.empty(); | 若c中存储了元素,返回 false,不然返回 true |