template
<
class
T,
class
Allocator
=
std::
allocator
<
T
>
>
class
deque
;
|
(1)
|
|
|
|
(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
|
-
|
要素の型。
|
|
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)
|
|
無効化に関する注記
メンバ型
| メンバ型
|
定義
|
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)
|
イテレータ
|
|
|
先頭を指すイテレータを返す
(公開メンバ関数)
|
|
|
終端を指すイテレータを返す
(公開メンバ関数)
|
|
|
先頭を指す逆方向イテレータを返す
(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)
|
2つの
deque
の値を辞書順で比較する
(関数テンプレート)
|
|
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート)
|
|
|
特定の条件を満たすすべての要素を削除する
(関数テンプレート)
|
注記
例
#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';
}
出力:
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
関連項目
|
|
コンテナをキュー(FIFOデータ構造)として提供するように適合させる
(クラステンプレート)
|
|