deque与vector的主要区别 vector,list,deque等内存分配及各方面的注意事项
vector,list,deque等内存分配及各方面的注意事项
http://blog.csdn.net/wxwjiayou/article/details/62224215
1.vector
其实连续存储空间,其容量总是大于等于其内元素的个数,当进行插入操作时,如果分配的内存空间不够,则会分配新的空间(大小为原来的空间加上原来空间的一半),其iterator是random Access iterator 。
2。list
其内存空间是链式存储是一个环状的双向链表,插入和删除都是常数时间,每次分配一个节点的内存空间。iterator不是普通的指针,而是可以进行++,--等操作的。
3.deque
其存储空间是双向开口的线性空间,从表面上看是连续的,但实际上是一段一段连续空间的组合。因为是连续空间的组合,所以要用一个中控器对其进行管理,中控器(map并不是STL中的map)是一小块连续的空间,每个元素都是一个指针,指向另一段比较大的连续线性空间,(若初始化时没有指定缓冲区大小默认值0将代表512bytes缓冲区)。iterator是一个random access iterator,结构包含(cur,frist,last,node)。
4.stack
可以将deque作为底层容器,也可以将list作为底层容器。没有迭代器。
5.queue
可以将deque作为底层容器,也可以将list作为底层容器。不提供迭代器。
6.heap
是STL的幕后帮手,帮助实现priority queue,binary heap是一个完全二叉树,以vector为底部容器。没有迭代器。
7.priority_queue
是一个大根堆,以vector为底层容器。没有迭代器。
8.slist
单向列表,和list的主要区别是是单向,这样会节省很多的空间。有迭代器,但只能单向。不是环状,最后一个元素指向0.

浙公网安备 33010602011771号
deque与vector的主要区别
https://www.cnblogs.com/zhuyf87/archive/2012/12/09/2809896.html
deque与vector非常相似。它也采用动态数组管理元素,提供随机存取,有着和vector几乎一样的接口。不同的是deque的动态数组头尾都开放,因此能在头尾两端进行快速安插和删除。
deque通常实作为一组独立区块,第一区块朝某方向扩展,最后一个区块朝另一个方向扩展。
deque与vector的主要不同之处在于:
1. 两端都能快速安插和删除元素,这些操作可以在分期摊还的常数时间(amortized constant time)内完成。
2. 元素的存取和迭代器的动作比vector稍慢。
3. 迭代器需要在不同区块间跳转,所以它非一般指针。
4. 因为deque使用不止一块内存(而vector必须使用一块连续内存),所以deque的max_size()可能更大。
5. 不支持对容量和内存重新分配时机的控制。不过deque的内存重分配优于vector,因为其内部结构显示,deque不必在内存重分配时复制所有元素。
6. 除了头尾两端,在任何地方安插或删除元素,都将导致指向deque元素的所有pointers、references、iterators失效。
7. deque的内存区块不再被使用时,会自动被释放。deque的内存大小是可自动缩减的。
8. deque与vector组织内存的方式不一样。在底层,deque按“页”(page)或“块”(chunk)来分配存储器,每页包含固定数目的元素。而vector只分配一块连续的内存。例如,一个10M字节的vector使用的是一整块10M字节的内存,而deque可以使用一串更小的内存块,比如10块1M的内存。所以不能将deque的地址(如&deque[0])传递给传统的C API,因为deque内部所使用的内存不一定会连续。
deque的下述特性与vector差不多:
1. 在中部安插、删除元素的速度较慢。
2. 迭代器属于random access iterator(随机存取迭代器)。
优先使用vector,还是deque?
c++标准建议:vector是那种应该在默认情况下使用的序列。如果大多数插入和删除操作发生在序列的头部或尾部时,应该选用deque。
使用deque还需注意:
1. 除了at(),其它成员函数均不会检查索引或迭代器是否有效。
2. 任何插入或删除动作都会使所有指向deque元素的pointers、references、iteartors失效,唯一例外的是在头部或尾部插入元素(此时pointers和references仍然有效,但iterators失效)。