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可以內含更多元素,因為它使用不止一塊內存。因此deque的max_size()可能更大。
5)deque不支持對容量和內存重分配時機的控制。特別要注意的是,除了頭尾兩端,在任何地方插入或刪除元素,都將導致指向deque元素的任何指針、引用、迭代器失效。不過,deque的內存重分配優於vector,因為其內部結構顯示,deque不必在內存重分配時復制所有元素。
6)deque的內存區塊不再被使用時,會被釋放。deque的內存大小是可縮減的。
deque的保存形式如下:
[堆1]
...
[堆2]
...
[堆3]
每個堆保存好幾個元素,然后堆和堆之間有指針指向,看起來像是list和vector的結合品,不過確實也是如此
deque可以讓你在前面快速地添加刪除元素,或是在后面快速地添加刪除元素,然后還可以有比較高的隨機訪問速度
vector是可以快速地在最后添加刪除元素,並可以快速地訪問任意元素
list是可以快速地在所有地方添加刪除元素,但是只能快速地訪問最開始與最后的元素
deque在開始和最后添加元素都一樣快,並提供了隨機訪問方法,像vector一樣使用[]訪問任意元素,但是隨機訪問速度比不上vector快,因為它要內部處理堆跳轉
deque也有保留空間.另外,由於deque不要求連續空間,所以可以保存的元素比vector更大,這點也要注意一下.還有就是在前面和后面添加元素時都不需要移動其它塊的元素,所以性能也很高。
以下情形,最好采用deque:
1)需要在兩端插入和刪除元素。
2)無需引用容器內的元素。
3)要求容器釋放不再使用的元素。
deque的各項操作只在以下幾點和vector不同:
1)deque不提供容量操作(capacity()和reserve())。
2)deque直接提供函數,用以完成頭部元素的插入和刪除(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()插入元素時發生異常,則該操作不帶來任何效應。
2)pop_back()和pop_front()不會拋出任何異常。