deque和vector的区别:
- deque两端都可以快速插入和删除元素。O(1)
vector只有尾部插入元素时为O(1) - deque的元素存取和迭代器相比会慢一点,因为deque的内部结构多了一个间接的过程。(vector的支持数组的随机访问;而deque虽然也是支持使用[]的运算符,但实际上是需要通过中央控制器二次寻址的,效率比vector略低。)
- deque的迭代器是特殊的智能指针,而不是一般的指针,它需要在不同的区之间跳转,因为deque不止一块内存。
- deque不支持容量和内存重分配时机的控制,除了首尾两端 安插和删除元素外,其他地方插入和删除元素都会导致迭代器失效。不过deque 内存重分配机制优于vector,因为deque不必在内存重分配时,复制所有的元素。
- deque的内存区块不再被使用时,会被释放。
- vector适用于对容器中元素进行频繁的访问的情况;而deque的适用于元素的频繁访问,并且在数据需要在头部和尾部进行插入和删除的情况。
- 请描述deque和vector对存储空间管理的不同?
- deque的底层是“中央控制区”和缓冲的结构。而vector是数组。
- vector在空间不够重新申请新空间策略是先申请一块比原来空间大的空间(1.5倍或两倍)将原来的数据拷贝一份到新的空间中,然后将原来的空间的释放;而deque的策略是申请一块固定大小(默认大小:512bytes)的空间,然后将该空间的地址存放在中央控制器中,并没有数据拷贝和空间的释放的过程,所以扩容时deque的效率要高于vector。
- 为什么STL的stack和queue额适配器默认优先使用deque而不是vector和list?
- stack适配deque相较于适配vector的优势:扩容代价不大,不需要拷贝数据浪费空间也不多。
- stack适配deque相较于适配list的优势:CPU高速cache命中。 其次不会频繁申请小块空间。申请和释放空间次数少代价低(支持随机访问)
- queue适配deque相较于适配list的优势:CPU高速cache命中。 其次不会频繁申请小块空间。申请和释放空间次数少代价低。