名前空間
変種
操作

std::deque

From 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 (double-ended queue、デック)は、シーケンスの先頭と末尾の両方で高速な挿入と削除を可能にする、インデックス付きシーケンスコンテナである。さらに、dequeのどちらかの端での挿入と削除は、残りの要素へのポインタや参照を決して無効にしない。

std::vector とは対照的に、deque の要素は連続して格納されない。典型的な実装では、個別に確保された固定長配列のシーケンスを追加の管理情報とともに使用する。これは、deque のインデックスアクセスがポインタのデリファレンスを2回実行する必要があることを意味するが、これに対して vector のインデックスアクセスは1回しか実行しない。

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

deque に対する一般的な操作の計算量(効率)は以下の通りである

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

std::dequeコンテナ(Container)アロケータ認識コンテナ(AllocatorAwareContainer)シーケンスコンテナ(SequenceContainer)リバーシブルコンテナ(ReversibleContainer) の要件を満たす。

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

しかし、std::deque オブジェクトは一般的に constexpr にはなれない。なぜなら、動的に確保されたストレージはすべて、同じ定数式の評価中に解放されなければならないからである。

(C++26以降)

目次

[編集] テンプレートパラメータ

T - 要素の型。
Tコピー代入可能(CopyAssignable)コピー構築可能(CopyConstructible) の要件を満たさなければならない。 (C++11まで)
要素に課される要件は、コンテナに対して実行される実際の操作に依存する。一般的に、要素型は完全な型であり、削除可能(Erasable) の要件を満たすことが要求されるが、多くのメンバ関数はより厳しい要件を課す。 (C++11以降)

[編集]

アロケータ - メモリの確保/解放、およびそのメモリ内の要素の構築/破棄に使用されるアロケータ。この型は アロケータ(Allocator) の要件を満たさなければならない。Allocator::value_typeT と同じでない場合、その振る舞いは未定義である(C++20まで)プログラムは不適格となる(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_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 value_type への LegacyRandomAccessIterator および ConstexprIterator(C++26から)[編集]
const_iterator const value_type への LegacyRandomAccessIteratorおよび ConstexprIterator(C++26から)[編集]
reverse_iterator std::reverse_iterator<iterator>[編集]
const_reverse_iterator std::reverse_iterator<const_iterator>[編集]

[編集] メンバ関数

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

[編集] 非メンバ関数

(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) コンテナのRangeコンストラクタとRange挿入
__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 であること

[編集] 関連項目

キュー (FIFO データ構造) を提供するためにコンテナを適応させる
(クラステンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)