1、deque簡介:
(1)deque是雙端佇列,雙端佇列是動態大小的序列式容器,可以向兩端進行伸縮。
(2)deque通常是一種動態陣列,允許隨機存取。
(3)deque在頭尾進行插入和刪除操作與vector類似,效率較高,但deque並不保證所有元素儲存在連續空間中,以指針加偏移進行存取有可能會非法。
(4)deque的內部實現比vector更加複雜,同時也使deque在某些特定情況下增長更加高效,尤其是序列比較大,重新分配成本比較高的情況下。
2、deque基本使用
(1)構造
(1)無參構造:deque()
(2)用n個val元素構造:deque(size_type n,const value_type& val=value_type())
(3)用範圍[first,last]區間構造:
deque(inputiterator first,inputiterator last)
(4)拷貝構造:
deque(const deque& x);
(2)迭代器
deque實際上一段假象的連續空間,**實際上是分段連續的,**而迭代器就是維繫這段假象空間的關鍵。
圖解釋:
紅顏色的表示一個迭代器,map表示將各個不連續空間的首地址整理儲存,而延伸出去的黑色方塊爲各個對應不連續空間。用first指向這段不連續空間的開始地址,last指向這段空間的結束地址,cur表示當前迭代器在這塊不連續空間裡的具體位置。
(1)iterator begin()
(2)iterator end()
(3)reverse_iterator rbegin()
(4)reverse_iterator rend()
(5)const_iterator cbegin()const
(6)const_iterator cend()const
(7)const_reverse_iterator cbegin()
(8)const_reverse_iterator cend()
(3)容量操作
vector和string有reserve而list和deque沒有reserve;
(1)返回有效元素個數:size_type size()const
(2)判空:bool empty()const
(3)改變有效元素個數,多出的用c填充
void resize(size_type sz,T c=T());
(4)元素存取
中括號過載,返回下標對應位置的元素
(1)reference operator[](size_type n);
(2)const_reference operator[](size_type n)const
返回deque的首尾元素
(3)reference front()
(4)const_reference front()const
(5)reference back()
(6)const_reference back()const
(5)修改
插入刪除:
(1)尾插:void push_back(const value_type& val)
(2)頭插:void push_front(const value_type& val)
(3)任意位置插入:
void insert(iterator postion,const value_type val);
void insert(iterator position,size_type n,const value_type& val);
void insert(iterator position,inputiterator first,inputiterator last);
(4)任意位置刪除:
iterator erase(iterator position);
iterator erase(iterator first,iterator last);
(5)頭刪:void pop_front();
(6)尾刪:void pop_back();
其他修改類操作:
(1)交換:
void swap(deque &x);
(2)清空
void clear();
(3)emplace
void emplace_frontt(Args&&……args);
void emplace_back(Args&&……arg);
和push_back、push_front差不多,只不過在插入自定義型別的時候會直接在插入的位置構造自定義物件,比push_back、push_front先構造自定義物件再將其拷貝到插入位置更加的高效。
3、deque的應用
deque最大的應用是作爲容器適配器stack和queue的底層結構。