命名空間
變體
動作

std::deque

出自 cppreference.com
< cpp‎ | container
 
 
 
 
定義於標頭檔 <deque>
template<

    class T,
    class Allocator = std::allocator<T>

> class deque;
(1)
namespace pmr {

    template< class T >
    using deque = std::deque<T, std::pmr::polymorphic_allocator<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 滿足 ContainerAllocatorAwareContainerSequenceContainerReversibleContainer 的要求。

std::deque 的所有成員函式皆為 constexpr:可以在常數表達式的評估中建立並使用 std::deque 物件。

然而,std::deque 物件通常不能為 constexpr,因為任何動態分配的儲存空間都必須在同一個常數表達式的評估中釋放。

(C++26 起)

目錄

[編輯] 範本參數

T - 元素的型別。
T 必須滿足 CopyAssignableCopyConstructible 的要求。 (直到 C++11)
對元素施加的要求取決於對容器實際執行的操作。通常要求元素型別為完整型別並滿足 Erasable 的要求,但許多成員函式會施加更嚴格的要求。 (C++11 起)

[編輯]

配置器 (Allocator) - 用於取得/釋放記憶體以及在該記憶體中建構/銷毀元素的配置器(Allocator)。此型別必須滿足 Allocator 的要求。若 Allocator::value_typeT 不相同,則行為未定義(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 若在開頭刪除 - 僅刪除的元素。

若在結尾刪除 - 僅刪除的元素與結尾後的迭代器。
其他情況 - 所有迭代器皆失效。
結尾後的迭代器失效時機未指明。(C++11 前)

結尾後的迭代器亦會失效,
除非刪除的元素位於容器開頭
且未刪除最後一個元素。

(C++11 起)
resize 若新大小小於舊大小 - 僅刪除的元素與
結尾後的迭代器。

若新大小大於舊大小 - 所有迭代器皆失效。
其他情況 - 沒有迭代器失效。

pop_front, pop_back 指向已刪除的元素。

結尾後的迭代器可能會失效(實作定義)。(C++11 前)
結尾後的迭代器亦會失效。(C++11 起)

[編輯] 失效說明

  • 當在 deque 的任一端插入時,insertemplace 不會使參考失效。
  • push_frontpush_backemplace_frontemplace_back 不會使指向 deque 元素的任何參考失效。
  • 當在 deque 的任一端刪除時,erasepop_frontpop_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

Allocator::pointer

(直到 C++11)

std::allocator_traits<Allocator>::pointer

(C++11 起)
[編輯]
const_pointer

Allocator::const_pointer

(直到 C++11)

std::allocator_traits<Allocator>::const_pointer

(C++11 起)
[編輯]
iterator LegacyRandomAccessIterator ConstexprIterator(C++26 起) 指向 value_type[編輯]
const_iterator LegacyRandomAccessIteratorConstexprIterator(C++26 起) 指向 const value_type[編輯]
reverse_iterator std::reverse_iterator<iterator>[編輯]
const_reverse_iterator std::reverse_iterator<const_iterator>[編輯]

[編輯] 成員函式

建構 deque
(公開成員函式) [編輯]
解構 deque
(公開成員函式) [編輯]
指派值給容器
(公開成員函式) [編輯]
指派值給容器
(公開成員函式) [編輯]
指派數值範圍給容器
(公開成員函式) [編輯]
回傳關聯的配置器
(公開成員函式) [編輯]
元素存取
存取指定元素,並進行邊界檢查
(公開成員函式) [編輯]
存取指定元素
(公開成員函式) [編輯]
存取第一個元素
(公開成員函式) [編輯]
存取最後一個元素
(公開成員函式) [編輯]
迭代器
回傳指向起點的反覆器
(公開成員函式) [編輯]
(C++11)
回傳指向終點的反覆器
(公開成員函式) [編輯]
回傳指向起點的反向反覆器
(公開成員函式) [編輯]
(C++11)
回傳指向終點的反向反覆器
(公開成員函式) [編輯]
容量
檢查容器是否為空
(公開成員函式) [編輯]
回傳元素個數
(公開成員函式) [編輯]
回傳最大可能的元素個數
(公開成員函式) [編輯]
透過釋放未使用的記憶體來減少記憶體使用量
(公開成員函式) [編輯]
修改器
清除內容
(公開成員函式) [編輯]
插入元素
(公開成員函式) [編輯]
插入數值範圍元素
(公開成員函式) [編輯]
(C++11)
原地建構元素
(公開成員函式) [編輯]
刪除元素
(公開成員函式) [編輯]
新增元素到結尾
(公開成員函式) [編輯]
原地建構一個元素到結尾
(公開成員函式) [編輯]
新增數值範圍元素到結尾
(公開成員函式) [編輯]
移除最後一個元素
(公開成員函式) [編輯]
插入元素到開頭
(公開成員函式) [編輯]
原地建構一個元素到開頭
(公開成員函式) [編輯]
新增數值範圍元素到開頭
(公開成員函式) [編輯]
移除第一個元素
(公開成員函式) [編輯]
更改儲存的元素個數
(公開成員函式) [編輯]
交換內容
(公開成員函式) [編輯]

[編輯] 非成員函式

(於 C++20 中移除)(於 C++20 中移除)(於 C++20 中移除)(於 C++20 中移除)(於 C++20 中移除)(自 C++20 起)
按字典序比較兩個 deque 的值
(函式模板) [edit]
特化 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 資料結構)
(類別樣板) [編輯]
English Deutsch 日本語 中文(简体) 中文(繁體)