vector和built-in数组相似,拥有一段连续的内存空间,能很是好的支持随即存取,即[]操做符,但因为它的内存空间是连续的,因此在中间进行插入和删除会形成内存块的拷贝。数组
另外,当插入较多的元素后,预留内存空间可能不够,须要从新申请一块足够大的内存并把原来的数据拷贝到新的内存空间。这些影响了vector的效率,可是实际上用的最多的仍是vector容器,建议大多数时候使用vector效率通常是不错的。数据结构
list就是数据结构中的双向链表(根据sgi stl源代码),所以它的内存空间是不连续的,经过指针来进行数据的访问,这个特色使得它的随即存取变的很是没有效率,所以它没有提供[]操做符的重载。但因为链表的特色,它能够以很好的效率支持任意地方的删除和插入。
ui
deque是一个double-ended queue,它的具体实现不太清楚,但知道它具备如下两个特色:它支持[]操做符,也就是支持随即存取,而且和vector的效率相差无几,它支持在两端的操做:push_back,push_front,pop_back,pop_front等,而且在两端操做上与list的效率也差很少。
spa
优势:指针
随机存取,即[]操做和vector.at()排序
动态操做,push_back()与pop_back()索引
自动调整内存,节省空间内存
缺点:效率
实现插入与删除操做效率低容器
只能在尾部插入与删除,在头部插入与删除消耗时间规模与容器大小成正比。
当动态添加的数据超过默认内存大小时,要进行总体的从新分配,拷贝与释放。
优势:
内存不连续
动态操做,插入与删除效率高
可在两端进行pop,push
缺点:
不能随机访问
相对于vector占用内存多
优势:
随机访问,即[]操做和deque.at()
插入与删除方便
可在双端进行pop,push
缺点:
占用内存多。
三者都能实现resize()来从新调整容器的大小。
1)vector能实现随即存取,即[]操做,而list不能,deque是两者的结合体,也可以实现索引操做[],但效率没有vector高。
2)vector适合在文件的末尾实现删除元素的操做pop_back()与插入操做push_back(),在中间时效率很是低下。而list能够在容器的任何位置实现插入与删除操做。
缘由:vector的元素地址连续,若是在中间插入与删除操做,可能会致使原来的内存地址不足以存储当前的元素,须要从新分配内存地址,这就须要将原来的全部元素拷贝到新内存,释放旧的内存地址等操做,操做代价高昂。而list元素内存地址不连续,用指针操做,其自己是一个双向链表,它的高效率体如今插入,删除以及排序等移动大量元素的操做。
1. 若是你须要高效的随即存取,而不在意插入和删除的效率,使用vector
2. 若是你须要大量的插入和删除,而不关心随即存取,则应使用list
3. 若是你须要随即存取,并且关心两端数据的插入和删除,则应使用deque。