Namespaces
Variants

std:: deque

From ja.cppreference.net
ヘッダーで定義 <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 (ダブルエンドキュー) は、先頭と末尾の両方で高速な挿入と削除を可能とするインデックス付きシーケンスコンテナです。さらに、デキューのどちらかの端での挿入と削除は、他の要素へのポインタや参照を決して無効化しません。

std::vector とは対照的に、dequeの要素は連続して格納されません:典型的な実装では、個別に割り当てられた固定サイズの配列のシーケンスと追加の簿記処理を使用します。これは、dequeへのインデックスアクセスが2回のポインタ間接参照を実行する必要があることを意味し、vectorのインデックスアクセスが1回のみ実行するのと比較されます。

dequeのストレージは必要に応じて自動的に拡張および縮小されます。dequeの拡張は、 std::vector の拡張よりもコストが低くなります。これは、既存の要素を新しいメモリ位置にコピーする必要がないためです。一方、dequeは通常、大きな最小メモリコストを持ちます。たとえば、1つの要素しか保持していないdequeでも、その内部配列全体を割り当てる必要があります(64ビットlibstdc++ではオブジェクトサイズの8倍、64ビットlibc++ではオブジェクトサイズの16倍または4096バイトのいずれか大きい方)。

デキューにおける一般的な操作の複雑性(効率)は以下の通りです:

  • ランダムアクセス - 定数時間 O(1) 。
  • 末尾または先頭への要素の挿入・削除 - 定数時間 O(1) 。
  • 要素の挿入・削除 - 線形時間 O(n) 。

std::deque は Container 、 AllocatorAwareContainer 、 SequenceContainer および ReversibleContainer の要件を満たします。

std::dequeのすべてのメンバー関数は std::deque constexpr です:定数式の評価において std::deque オブジェクトを作成して使用することが可能です。

ただし、 std::deque オブジェクト自体は一般的に constexpr にはできません。なぜなら、動的に確保されたストレージは同じ定数式の評価内で解放されなければならないためです。

(C++26以降)

目次

テンプレートパラメータ

T - 要素の型。
T は CopyAssignable および CopyConstructible の要件を満たさなければならない。 (C++11以前)
要素に課せられる要件は、コンテナで実際に実行される操作に依存する。一般的には、要素型が完全型であり、 Erasable の要件を満たすことが要求されるが、多くのメンバ関数はより厳格な要件を課す。 (C++11以降)

Allocator - メモリの取得/解放およびそのメモリ内の要素の構築/破棄に使用されるアロケータ。この型は Allocator の要件を満たさなければならない。 動作は未定義 (C++20以前) プログラムは不適格 (C++20以降) となる( Allocator::value_type が T と同じでない場合)。

イテレータの無効化

操作 無効化されるもの
すべての読み取り専用操作 無効化されない
swap , std::swap 末尾の次のイテレータが無効化される可能性あり(実装定義)
shrink_to_fit , clear , insert ,
emplace , push_front , push_back ,
emplace_front , emplace_back
常に無効化される
erase 先頭で削除する場合 - 削除された要素のみ

末尾で削除する場合 - 削除された要素と末尾の次のイテレータ
それ以外の場合 - すべてのイテレータが無効化される

末尾の次のイテレータが無効化されるタイミングは未規定

(until C++11)

末尾の次のイテレータも無効化される(ただし、削除された要素が
コンテナの先頭にあり、最後の要素が削除されない場合を除く)

(since C++11)
resize 新しいサイズが古いサイズより小さい場合 - 削除された要素と
末尾の次のイテレータのみ

新しいサイズが古いサイズより大きい場合 - すべてのイテレータが無効化される
それ以外の場合 - イテレータは無効化されない

pop_front , pop_back 削除された要素に対して

末尾の次のイテレータが無効化される可能性あり(実装定義)

(until C++11)

末尾の次のイテレータも無効化される

(since 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

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 LegacyRandomAccessIterator および ConstexprIterator(C++26以降) から const value_type
reverse_iterator std::reverse_iterator<iterator>
const_reverse_iterator std::reverse_iterator<const_iterator>

メンバー関数

dequeを構築する
(公開メンバ関数)
dequeを破棄する
(public member function)
コンテナに値を代入する
(公開メンバ関数)
コンテナに値を割り当てる
(公開メンバ関数)
コンテナに値の範囲を割り当てる
(公開メンバ関数)
関連付けられたアロケータを返す
(公開メンバ関数)
要素アクセス
境界チェック付きで指定された要素にアクセス
(公開メンバ関数)
指定された要素にアクセス
(公開メンバ関数)
最初の要素にアクセスする
(公開メンバ関数)
最後の要素にアクセスする
(public member function)
イテレータ
先頭を指すイテレータを返す
(公開メンバ関数)
(C++11)
終端を指すイテレータを返す
(公開メンバ関数)
先頭を指す逆方向イテレータを返す
(public member function)
(C++11)
末尾を指す逆方向イテレータを返す
(公開メンバ関数)
容量
コンテナが空かどうかをチェックする
(公開メンバ関数)
要素数を返す
(公開メンバ関数)
要素の最大可能数を返す
(public member function)
未使用のメモリを解放してメモリ使用量を削減します
(公開メンバー関数)
修飾子
内容をクリアする
(公開メンバ関数)
要素を挿入する
(public member function)
要素の範囲を挿入する
(公開メンバ関数)
(C++11)
要素をその場で構築する
(公開メンバ関数)
要素を削除する
(公開メンバ関数)
末尾に要素を追加する
(public member function)
要素をその場で末尾に構築する
(公開メンバ関数)
末尾に要素の範囲を追加する
(公開メンバ関数)
最後の要素を削除する
(公開メンバ関数)
先頭に要素を挿入する
(公開メンバ関数)
先頭に要素をその場で構築する
(公開メンバ関数)
先頭に要素の範囲を追加する
(public member function)
先頭要素を削除する
(公開メンバ関数)
格納されている要素の数を変更する
(公開メンバ関数)
内容を交換する
(公開メンバ関数)

非メンバー関数

(C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20)
2つの deque の値を辞書順で比較する
(関数テンプレート)
std::swap アルゴリズムを特殊化する
(関数テンプレート)
特定の条件を満たすすべての要素を削除する
(関数テンプレート)

推論ガイド

(C++17以降)

注記

機能テスト マクロ 値 標準 機能
__cpp_lib_containers_ranges 202202L (C++23) コンテナのためのレンジ構築と挿入
__cpp_lib_constexpr_deque 202502L (C++26) constexpr std::deque

例

#include <deque>
#include <iostream>
int main()
{
    // 整数を含むdequeを作成
    std::deque<int> d = {7, 5, 16, 8};
    // dequeの先頭と末尾に整数を追加
    d.push_front(13);
    d.push_back(25);
    // 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 であることが要求される

関連項目

コンテナをキュー(FIFOデータ構造)として提供するように適合させる
(クラステンプレート)