C++ Primer中关于list和vector的比较

来源:互联网 发布:初中生教学软件有哪些 编辑:程序博客网 时间:2024/06/12 21:43

vector 表示一段连续的内存区域,每个元素被顺序存储在这段内存中。对vector 的随机访问(比如先访问元素5 然后访问15 然后再访问7 等等)效率很高,因为每次访问离vector起始处的位移都是固定的。但是,在任意位置,而不是在vector 末尾插人元素,则效率很低,因为它需要把待插入元素右边的每个元素都拷贝一遍。类似地删除任意一个而不是vector的最后一个元素,效率同样很低,因为待删除元素右边的每个元素都必须被复制一遍。这种代价对于大型的复杂的类对象来说尤其大(一个deque 也表示一段连续的内存区域但是与vector 不同的是它支持高效地在其首部插入和删除元素它通过两级数组结构来实现一级表示实际的容器第二级指向容器的首和尾)。

    list 表示非连续的内存区域,并通过一对指向首尾元素的指针双向链接起来,从而允许向前和向后两个方向进行遍历。在list 的任意位置插入和删除元素的效率都很高。指针必须被重新赋值,但是,不需要用拷贝元素来实现移动。另一方面,它对随机访问的支持并不好。访问一个元素需要遍历中间的元素,另外每个元素还有两个指针的额外空间开销。下面是选择顺序容器类型的一些准则:
1.如果我们需要随机访问一个容器则vector 要比list 好得多
2.如果我们已知要存储元素的个数则vector 又是一个比list 好的选择
3.如果我们需要的不只是在容器两端插入和删除元素,则list 显然要比vector 好
4.除非我们需要在容器首部插入和删除元素否则vector 要比deque 好

    list 以简单方式增长。每当一个新对象被插入到list 中时,插入处的两个元素的前指针和后指针被重新赋值为指向新对象,新对象的前后指针被初始化为指向这两个元素。list 只占有其包含的元素所必需的存储区。额外的开销有两个方面:与每个值相关联的两个附加指针以及通过指针进行的间接访问

 

 

C++ STL 提供了3个序列容器 :vector, deque, list
vector 中的元素是顺序存放的,所以随机访问很快,但是要插入和删除,这个时间复杂度就很高了,vector初始化时有一个capacity,如果元素个数超出capacity,那vector就会重新分配一个新的空间,并把旧值复制到新的空间中,释法原空间,这个也要耗费很多时间,所以如果你知道元素的最大值,最好用reserve()函数初始最大空间,避免重新分配空间造成的时间。
deque 几乎所有的操作都和vector一样,出了可以在头添加和删除,多了个push_front(), pop_front();
list 是双链表,元素在内存中是分散的不连续的,它使用指针left,right,指向前一个元素和后一个元素。所以要删除和添加只要动动指针,所以很快,但是因为是不连续的所以要访问一个元素,你只能遍历序列。

原创粉丝点击