vector list deque三者的区别与联系

vector

将元素置于一个动态数组中加以管理,支持随机访问,数组尾部添加或移除元素非常快速。但是在中部或头部安插元素比较费时;vector底层动态维护了一段连续的空间,随着元素的加入,当容器中的元素存放满时,如果再要加入其它数据,vector的内部机制会自动的进行扩容以容纳新元素。

 扩容:  (1)配置一块新空间

             (2)将旧元素一一搬往新址

             (3)把原来的空间释放还给系统

                             vector list deque三者的区别与联系

 

list

非连续存储结构,具有双链表结构,每个元素维护一对前向和后向指针,因此支持前向/后向遍历。支持高效的随机插入/删除操作,但随机访问效率低下,且由于需要额外维护指针,开销也比较大。每一个结点都包括一个信息快Info、一个前驱指针Pre、一个后驱指针Post。可以不分配必须的内存大小方便的进行添加和删除操作。使用的是非连续的内存空间进行存储。

   优点:(1) 不使用连续内存完成动态操作。

        (2) 在内部方便的进行插入和删除操作

        (3) 可在两端进行push、pop

   缺点:(1) 不能进行内部的随机访问,即不支持[ ]操作符和vector.at()

             (2) 相对于verctor占用内存多

                                                  vector list deque三者的区别与联系

vector和list有什么区别?分别在什么场景下应用

Vector

优点:和数组类似开辟一段连续的空间,并且支持随机访问,所以它的查找效率高其时间复杂度O(1)。

缺点:由于开辟一段连续的空间,所以插入删除会需要对数据进行移动比较麻烦,时间复杂度O(n),另外当空间不足时还需要进行扩容。

List

优点:底层实现是循环双链表,当对大量数据进行插入删除时,其时间复杂度O(1)

缺点:底层没有连续的空间,只能通过指针来访问,所以查找数据需要遍历其时间复杂度O(n),没有提供[]操作符的重载。

应用场景

vector拥有一段连续的内存空间,因此支持随机访问,如果需要高效的随即访问,而不在乎插入和删除的效率,使用vector。

list拥有一段不连续的内存空间,如果需要高效的插入和删除,而不关心随机访问,则应使用list。

 

deque

vector是单向开口的线性连续空间,deque是双向开口的线性连续空间。所谓双向开口:是指可以在头尾两端分别进行元素的插入和删除操作,因此deque允许常数时间内对头端进行数据的插入操作

                                      vector list deque三者的区别与联系

deque是在分段的定量连续空间上维护其连续的假象,与vector不同。deque由一段一段定量的连续空间构成,一旦有必在deque的前端或尾端增加新空间,便配置一段定量连续空间串接在整个deque的头端和尾端。

deque的迭代器

因为deque是分段连续空间,维护其“整体连续”假象的任务就落在其迭代器operator++和operator--上。因此deque的迭代器必须要知道分段连续空间在哪里,其次它必须能够识别出自己是否已经处于其所在某段连续空间的边缘,如果是,一旦前进或后退时就必须跳跃至下/上一个分段空间

   优点:(1) 随机访问方便,即支持[ ]操作符和vector.at()

              (2) 在内部方便的进行插入和删除操作

             (3) 可在两端进行push、pop

   缺点:占用内存多

deque和vector的区别

1. 两端都能快速安插和删除元素,这些操作可以在分期摊还的常数时间(amortized constant time)内完成。

2. 元素的存取和迭代器的动作比vector稍慢。

3. 迭代器需要在不同区块间跳转,所以它非一般指针。

4. 因为deque使用不止一块内存(而vector必须使用一块连续内存)

5. deque不必在内存重分配时复制所有元素。

6. 除了头尾两端,在任何地方安插或删除元素,都将导致指向deque元素的所有pointers、references、iterators失效。

7. deque的内存区块不再被使用时,会自动被释放。deque的内存大小是可自动缩减的。

8. 在底层,deque按“页”(page)或“块”(chunk)来分配存储器,每页包含固定数目的元素。而vector只分配一块连续的内存。

相同点:

1. 在中部安插、删除元素的速度较慢。

2. 迭代器属于random access iterator(随机存取迭代器)。

 

优先使用vector,还是deque / list 

    (1)如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector

    (2)如果你需要大量的插入和删除,而不关心随机存取,则应使用list

    (3)如果你需要随机存取,而且关心两端数据的插入和删除效率,则应使用deque