顺序容器list vector

来源:互联网 发布:淘宝查号kehuda 编辑:程序博客网 时间:2024/05/01 21:41

一、结构

vector 表示一段连续的内存区域每个元素被顺序存储在这段内存中对vector 的随机访问(比如先访问元素5 然后访问15 然后再访问7 等等)效率很高因为每次访问离vector起始处的位移都是固定的
但是在任意位置而不是在vector 末尾插人元素则效率很低
因为它需要把待插入元素右边的每个元素都拷贝一遍
类似地删除任意一个而不是vector的最后一个元素效率同样很低因为待删除元素右边的每个元素都必须被复制一遍
这种代价对于大型的复杂的类对象来说尤其大

一个deque 也表示一段连续的内存区域但是与vector 不同的是它支持高效地在其首部插入和删除元素它通过两级数组结构来实现一级表示实际的容器第二级指向容器的首和尾
除非我们需要在容器首部插入和删除元素否则vector 要比deque 好

list 表示非连续的内存区域,并通过一对指向首尾元素的指针双向链接起来,从而允许向前和向后两个方向进行遍历。在list 的任意位置插入和删除元素的效率都很高:指针必须被重新赋值,但是不需要用拷贝元素来实现移动
另一方面它对随机访问的支持并不好访问一个元素需要遍历中间的元素,另外每个元素还有两个指针的额外空间开销。

string也表示一段连续的内存区域

 

二、list、vector的自我增长
list
  简单地链接新元素
vector
  为了提高效率实际上vector 并不是随每一个元素的插入而增长自己,而是当vector 需要增长自身时它实际分配的空间比当前所需的空间要多一些,
  也就是说它分配了一些额外的内存容量或者说它预留了这些存储区,从而提高动态增长效率
  但当vector增长的元素个数超过预留存储区容量时,vector 以下列方式重新自我增长:它分配双倍于当前容量的存储区把当前的值拷贝到新分配的内存中井释放原来的内存(注意,如果元素为非简单类时,将调用拷贝构造函数和析构函数)
 
  对于小的对象,vector 在实践中比list的动态增长的支持效率更高

原创粉丝点击