C++:deque的使用細則

deque的介紹

deque在線文檔說明

  1. deque(發音類似“deck”),是雙端隊列不規則的首字母縮寫,雙端隊列是動態大小的序列式容器,其可以像兩端進行伸縮。

  2. 特定的庫可以以不同的方式實現deque,但通常都是一種動態數組。不論在何種情況下,它都允許通過隨機訪問迭代器直接訪問單個元素,可以根據需要動態的伸縮。

  3. 因此,deque提供了一些與vector相似的功能,但deque在頭部和尾部進行數據插入和刪除操作更加高效。與vector不同的是,deque不能保證所有的元素存儲在連續的空間中,在deque中通過指針加偏移量方式訪問元素可能會導致非法的操作。

  4. vector與list提供了相似的接口,因此其具有類似的用途,但是內部的實現原理不同:vector使用使用了動態數組,該數組通常需要動態增長;deque中的元素可能分散在不同的存儲塊中,在deque中保存了一些必要的信息,通常用來在常數範圍內直接訪問deque中的任何一個元素,所以deque的內部實現比vector複雜,但是這些額外信息使得deque在某些情況下增長更加的高效,特別是在序列比較大,重新分配成本比較高的情況下。

  5. 除了在頻繁在頭部或尾部進行插入和刪除操作外,deque比list和forward_list的性能更差。

在這裏插入圖片描述

deque的使用

deque的構造

函數聲明 接口說明
deque() 構造空的雙端隊列
deque(n, val = value_type()) 用n個值爲val的元素構造雙端隊列
deque(InputIterator first, InputIterator last) 用[first, last)的區間構造雙端隊列
deque(const deque& x) 雙端隊列的拷貝構造函數

deque的迭代器

雙端隊列底層是一段假象的連續空間,實際是分段連續的,爲了維護其“整體連續”的假象,落在了deque的 迭代器身上。 下圖爲deque的原理圖:

在這裏插入圖片描述

函數聲明 接口說明
[begin(), end()) begin:容器起始位置 end最後一個元素下一個位置
[rbegin(), rend()) 反向迭代器rbegin在end位置,rend在begin
[cbegin(), cend()) const迭代器,與begin和end位置相同,但不能修改其空間內容
[crbegin(), crend()) const反向迭代器,與crbegin在cend位置,crend在cbegin位置

deque的容量操作

函數聲明 接口說明
size() 返回deque中有效元素個數
empty() 檢測deque是否爲空,是返回true,否則返回false
resize(sz, value) 將deque中的元素改變到sz,多出的空間用value填充

deque的元素訪問操作

函數聲明 接口說明
operator[] 返回deque中n位置上元素的引用
front() 返回deque中首元素的引用
back() 返回deque中最後一個元素的引用

deque中修改操作

函數聲明 接口說明
push_back() 和 pop_back() deque的尾插和尾刪
push_front() 和 pop_front() deque的頭插和頭刪
insert(pos, value)和 erase(pos) deque任意位置插入和刪除
swap() 交換兩個deque中的內容
clear() 將deque中的元素清空

deque的應用場景

deque在序列式容器中比較雞肋,因爲如果只是簡單的存儲元素,使用vector即可,如果對元素任意位置進行插入或者刪除操作比較多,使用list即可,所以一般很少去使用deque。deque最大的應用,就是用其作爲標準庫中stack和queue的底層結構

要點總結

1、deque的實現:

動態二維數組:
二級指針先給第一維分配空間,也就是分配n個一級指針的空間,然後再給裏面的每個一級指針分配空間,這樣就形成了一個動態二維數組

deque只給第一維分配空間,然後找到正中的位置pos(保證向前向後都有足夠大的空間),然後給該位置分配空間。

當這個空間向後用完的時候,pos加 一 ,然後給新的pos申請空間,使用新的pos繼續存儲。向前類似。
※向前存儲會從後向前存儲

2、deque的迭代器

迭代器有四個成員變量:

  • 我在我家的哪——當前迭代器的位置
  • 我家從哪開始——當前迭代器所在一維數組的起始位置
  • 我家從哪結束——當前迭代器所在一維數組的終止位置
  • 我家在哪——當前迭代器所在一維數組的地址

3、deque的擴容

當map的空間向前或向後填滿的時候,如果還需要存儲新的數據,就要擴容。擴容只針對map,對已有的一維數組不產生任何影響。map擴容後,會把原來的指針數據居中放入新申請的空間,完成擴容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章