deque用法 和與vector的區別


deque是雙向開口的連續性存儲空間。雖說是連續性存儲空間,但這種連續性只是表面上的,實際上它的內存是動態分配的,它在堆上分配了一塊一塊的動態儲存區,每一塊動態存儲去本身是連續的,deque自身的機制把這一塊一塊的存儲區虛擬地連在一起。

        它首次插入一個元素,默認會動態分配512字節空間,當這512字節空間用完后,它會再動態分配自己另外的512字節空間,然后虛擬地連在一起。deque的這種設計使得它具有比vector復雜得多的架構、算法和迭代器設計。它的性能損失比之vector,是幾個數量級的差別。所以說,deque要慎用

使用deque之前,必須先包含頭文件<deque>

#include <deque>

deque類是定義於命名空間std內的一個class template

namespace std 

{template <class T, class Allocator = allocator<T> >  class deque;}

 

vector相比,deque功能上的不同之處在於:

1)兩端都能快速插入元素和刪除元素(vector只在尾端快速進行此類操作)。

2)存取元素時,deque的內部結構會多一個間接過程,所以元素的存取和迭代器的動作會稍稍慢一些。

3)迭代器需要在不同區塊間跳轉,所以必須是特殊的智能型指針,非一般指針。

4)在對內存區塊有所限制的系統中(例如PC系統),deque可以內含更多元素,因為它使用不止一塊內存。因此dequemax_size()可能更大。

5deque不支持對容量和內存重分配時機的控制。特別要注意的是,除了頭尾兩端,在任何地方插入或刪除元素,都將導致指向deque元素的任何指針、引用、迭代器失效。不過,deque的內存重分配優於vector,因為其內部結構顯示,deque不必在內存重分配時復制所有元素。

6deque的內存區塊不再被使用時,會被釋放。deque的內存大小是可縮減的。



deque的保存形式如下:

[1]
...
[2]
...
[3]

每個堆保存好幾個元素,然后堆和堆之間有指針指向,看起來像是listvector的結合品,不過確實也是如此
deque可以讓你在前面快速地添加刪除元素,或是在后面快速地添加刪除元素,然后還可以有比較高的隨機訪問速度

vector是可以快速地在最后添加刪除元素,並可以快速地訪問任意元素
list是可以快速地在所有地方添加刪除元素,但是只能快速地訪問最開始與最后的元素
deque在開始和最后添加元素都一樣快,並提供了隨機訪問方法,vector一樣使用[]訪問任意元素,但是隨機訪問速度比不上vector,因為它要內部處理堆跳轉
deque也有保留空間.另外,由於deque不要求連續空間,所以可以保存的元素比vector更大,這點也要注意一下.還有就是在前面和后面添加元素時都不需要移動其它塊的元素,所以性能也很高。

 

以下情形,最好采用deque

1)需要在兩端插入和刪除元素。

2)無需引用容器內的元素。

3)要求容器釋放不再使用的元素。

 

deque的各項操作只在以下幾點和vector不同:

1deque不提供容量操作(capacity()reserve())。

2deque直接提供函數,用以完成頭部元素的插入和刪除(push_front()pop_front())。

 

除了at(),沒有任何成員函數會檢查索引或迭代器是否有效。元素的插入或刪除可能導致內存重新分配,所以任何插入或刪除動作都會使所有指向deque元素的指針、引用和迭代器失效。惟一例外的是在頭部或尾部插入元素,操作之后,指針和引用仍然有效,但迭代器將失效。

 

deque頭部元素的插入和刪除

deque<int> d;

for (int index = 0; index < 10; index++)

{

d.push_front(index);

}

d.pop_front();

 

異常處理

C++標准程序庫保證下列行為:

1)如果以push_back()push_front()插入元素時發生異常,則該操作不帶來任何效應。

2pop_back()pop_front()不會拋出任何異常。

 

 

個人網站http://www.ravedonut.com/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM