名稱空間
變體
操作

std::deque

來自 cppreference.com
< cpp‎ | 容器
 
 
 
 
在標頭檔案 <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 必須滿足 可複製賦值 (CopyAssignable)可複製構造 (CopyConstructible) 的要求。 (C++11 前)
對元素的要求取決於在容器上執行的實際操作。通常,要求元素型別是完整型別並滿足 可擦除 (Erasable) 的要求,但許多成員函式會施加更嚴格的要求。 (C++11 起)

[編輯]

Allocator - 用於獲取/釋放記憶體以及在該記憶體中構造/銷燬元素的分配器。型別必須滿足 分配器 (Allocator) 的要求。如果 Allocator::value_typeT 不同,則行為未定義(直至 C++20)如果 Allocator::value_typeT 不同,則程式格式錯誤(自 C++20 起)[編輯]

[編輯] 迭代器失效

操作 失效
所有隻讀操作。 從不失效。
swap, std::swap 末尾迭代器可能失效(實現定義)。
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
(public member function) [編輯]
銷燬 deque
(public member function) [編輯]
將值賦給容器
(public member function) [編輯]
將值賦給容器
(public member function) [編輯]
將一個範圍的值賦給容器
(public member function) [編輯]
返回關聯的分配器
(public member function) [編輯]
元素訪問
訪問指定的元素,帶邊界檢查
(public member function) [編輯]
訪問指定的元素
(public member function) [編輯]
訪問第一個元素
(public member function) [編輯]
訪問最後一個元素
(public member function) [編輯]
迭代器
返回指向起始的迭代器
(public member function) [編輯]
(C++11)
返回指向末尾的迭代器
(public member function) [編輯]
返回指向起始的逆向迭代器
(public member function) [編輯]
(C++11)
返回指向末尾的逆向迭代器
(public member function) [編輯]
容量
檢查容器是否為空
(public member function) [編輯]
返回元素數量
(public member function) [編輯]
返回元素的最大可能數量
(public member function) [編輯]
透過釋放未使用的記憶體來減少記憶體使用
(public member function) [編輯]
修改器
清除內容
(public member function) [編輯]
插入元素
(public member function) [編輯]
插入元素範圍
(public member function) [編輯]
(C++11)
就地構造元素
(public member function) [編輯]
擦除元素
(public member function) [編輯]
新增元素到結尾
(public member function) [編輯]
就地構造元素於結尾
(public member function) [編輯]
新增一個元素範圍到結尾
(public member function) [編輯]
移除末元素
(public member function) [編輯]
插入元素到起始
(public member function) [編輯]
就地構造元素於起始
(public member function) [編輯]
新增一個元素範圍到起始
(public member function) [編輯]
移除首元素
(public member function) [編輯]
更改儲存的元素數量
(public member function) [編輯]
交換內容
(public member function) [編輯]

[編輯] 非成員函式

(在 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++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 230 C++98 T 不要求為可複製構造 (CopyConstructible)
(型別 T 的元素可能無法被構造)
T 也要求
可複製構造 (CopyConstructible)

[編輯] 另請參閱

將容器適配為提供佇列(先進先出資料結構)
(類模板) [編輯]