std::deque
| 定義於標頭檔 <deque> |
||
| template< class T, |
(1) | |
| namespace pmr { template< class T > |
(2) | (自 C++17 起) |
std::deque (雙向佇列) 是一個索引順序容器,允許在開頭與結尾進行快速的插入與刪除。此外,在 deque 的任一端進行插入或刪除,絕不會使指向其餘元素的指標或參考失效。
與 std::vector 相反,deque 的元素並非連續儲存:典型實作使用一系列個別分配的固定大小陣列,加上額外的簿記,這意味著對 deque 進行索引存取時必須執行兩次指標解參考,而 vector 的索引存取僅執行一次。
deque 的儲存空間會根據需要自動擴充與縮減。擴充 deque 比擴充 std::vector 的成本更低,因為它不涉及將現有元素複製到新的記憶體位置。另一方面,deque 通常具有較高的最小記憶體成本;一個僅持有一個元素的 deque 必須配置其完整的內部陣列(例如在 64 位元 libstdc++ 上為物件大小的 8 倍;在 64 位元 libc++ 上為物件大小的 16 倍或 4096 位元組,取較大者)。
deque 常見操作的複雜度(效率)如下:
- 隨機存取 - 常數時間 O(1)。
- 在結尾或開頭插入或移除元素 - 常數時間 O(1)。
- 插入或移除元素 - 線性時間 O(n)。
std::deque 滿足 Container、AllocatorAwareContainer、SequenceContainer 和 ReversibleContainer 的要求。
|
|
(C++26 起) |
目錄 |
[編輯] 範本參數
| T | - | 元素的型別。
| ||||
| 配置器 (Allocator) | - | 用於取得/釋放記憶體以及在該記憶體中建構/銷毀元素的配置器(Allocator)。此型別必須滿足 Allocator 的要求。若 Allocator::value_type 與 T 不相同,則行為未定義(C++20 前)程式格式錯誤(C++20 起)。 |
[編輯] 迭代器失效
| 本節尚不完整 原因:此章節仍有一些不準確之處,請參閱個別成員函式頁面以取得詳細資訊。 |
| 作業 (Operations) | 失效情況 | ||
|---|---|---|---|
| 所有唯讀操作。 | 永不。 | ||
| swap, std::swap | 結尾後的迭代器(past-the-end iterator)可能會失效(實作定義)。 | ||
| shrink_to_fit, clear, insert, emplace, push_front, push_back, emplace_front, emplace_back |
總是失效。 | ||
| erase | 若在開頭刪除 - 僅刪除的元素。 若在結尾刪除 - 僅刪除的元素與結尾後的迭代器。
| ||
| resize | 若新大小小於舊大小 - 僅刪除的元素與 結尾後的迭代器。 若新大小大於舊大小 - 所有迭代器皆失效。 | ||
| pop_front, pop_back | 指向已刪除的元素。 結尾後的迭代器可能會失效(實作定義)。(C++11 前) |
[編輯] 失效說明
- 當在 deque 的任一端插入時,insert 和 emplace 不會使參考失效。
- push_front、push_back、emplace_front 和 emplace_back 不會使指向 deque 元素的任何參考失效。
- 當在 deque 的任一端刪除時,erase、pop_front 和 pop_back 不會使指向非刪除元素的參考失效。
- 以較小大小呼叫 resize 不會使指向非刪除元素的參考失效。
- 以較大大小呼叫 resize 不會使指向 deque 元素的任何參考失效。
[編輯] 成員型別
| 成員型別 | 定義 | ||||
value_type
|
T | ||||
allocator_type
|
Allocator | ||||
size_type
|
無號整數型別(通常為 std::size_t) | ||||
difference_type
|
有號整數型別(通常為 std::ptrdiff_t) | ||||
reference
|
value_type& | ||||
const_reference
|
const value_type& | ||||
pointer
|
| ||||
const_pointer
|
| ||||
iterator
|
LegacyRandomAccessIterator 與 ConstexprIterator(C++26 起) 指向 value_type | ||||
const_iterator
|
LegacyRandomAccessIterator 與 ConstexprIterator(C++26 起) 指向 const value_type | ||||
reverse_iterator
|
std::reverse_iterator<iterator> | ||||
const_reverse_iterator
|
std::reverse_iterator<const_iterator> |
[編輯] 成員函式
建構 deque(公開成員函式) | |
解構 deque(公開成員函式) | |
| 指派值給容器 (公開成員函式) | |
| 指派值給容器 (公開成員函式) | |
| (C++23) |
指派數值範圍給容器 (公開成員函式) |
| 回傳關聯的配置器 (公開成員函式) | |
元素存取 | |
| 存取指定元素,並進行邊界檢查 (公開成員函式) | |
| 存取指定元素 (公開成員函式) | |
| 存取第一個元素 (公開成員函式) | |
| 存取最後一個元素 (公開成員函式) | |
迭代器 | |
| (C++11) |
回傳指向起點的反覆器 (公開成員函式) |
| (C++11) |
回傳指向終點的反覆器 (公開成員函式) |
| (C++11) |
回傳指向起點的反向反覆器 (公開成員函式) |
| (C++11) |
回傳指向終點的反向反覆器 (公開成員函式) |
容量 | |
| 檢查容器是否為空 (公開成員函式) | |
| 回傳元素個數 (公開成員函式) | |
| 回傳最大可能的元素個數 (公開成員函式) | |
| (DR*) |
透過釋放未使用的記憶體來減少記憶體使用量 (公開成員函式) |
修改器 | |
| 清除內容 (公開成員函式) | |
| 插入元素 (公開成員函式) | |
| (C++23) |
插入數值範圍元素 (公開成員函式) |
| (C++11) |
原地建構元素 (公開成員函式) |
| 刪除元素 (公開成員函式) | |
| 新增元素到結尾 (公開成員函式) | |
| (C++11) |
原地建構一個元素到結尾 (公開成員函式) |
| (C++23) |
新增數值範圍元素到結尾 (公開成員函式) |
| 移除最後一個元素 (公開成員函式) | |
| 插入元素到開頭 (公開成員函式) | |
| (C++11) |
原地建構一個元素到開頭 (公開成員函式) |
| (C++23) |
新增數值範圍元素到開頭 (公開成員函式) |
| 移除第一個元素 (公開成員函式) | |
| 更改儲存的元素個數 (公開成員函式) | |
| 交換內容 (公開成員函式) | |
[編輯] 非成員函式
| (於 C++20 中移除)(於 C++20 中移除)(於 C++20 中移除)(於 C++20 中移除)(於 C++20 中移除)(自 C++20 起) |
按字典序比較兩個 deque 的值(函式模板) |
| 特化 std::swap 演算法 (函式範本) | |
| 移除所有符合特定條件的元素 (函式樣板) |
推導指引 |
(自 C++17 起) |
[編輯] 備註
| 功能測試巨集 | 數值 | 標準 | 功能 |
|---|---|---|---|
__cpp_lib_containers_ranges |
202202L |
(C++23) | 容器的範圍建構與插入 |
__cpp_lib_constexpr_containers |
202502L |
(C++26) | constexpr std::deque |
[編輯] 範例
#include <deque> #include <iostream> int main() { // Create a deque containing integers std::deque<int> d = {7, 5, 16, 8}; // Add an integer to the beginning and end of the deque d.push_front(13); d.push_back(25); // Iterate and print values of deque for (int n : d) std::cout << n << ' '; std::cout << '\n'; }
輸出
13 7 5 16 8 25
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯應用於之前的 C++ 標準。
| DR | 應用於 | 出版時的行為 | 正確的行為 |
|---|---|---|---|
| LWG 230 | C++98 | T 未被要求為 CopyConstructible(型別為 T 的元素可能無法被建構) |
T 現在也被要求為 CopyConstructible |
[編輯] 參閱
| 適配容器以提供佇列(queue,FIFO 資料結構) (類別樣板) |