std::deque
| ヘッダー <deque> で定義 |
||
| template< class T, |
(1) | |
| namespace pmr { template< class 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) の要件を満たす。
|
|
(C++26以降) |
目次 |
[編集] テンプレートパラメータ
| T | - | 要素の型。
| ||||
| アロケータ | - | メモリの確保/解放、およびそのメモリ内の要素の構築/破棄に使用されるアロケータ。この型は アロケータ(Allocator) の要件を満たさなければならない。Allocator::value_type が T と同じでない場合、その振る舞いは未定義である(C++20まで)プログラムは不適格となる(C++20から)。 |
[編集] イテレータの無効化
| このセクションは未完成です 理由: このセクションにはまだいくつかの不正確な点があるため、詳細は個々のメンバ関数のページを参照してください |
| 操作 | 無効になる条件 | ||
|---|---|---|---|
| すべての読み取り専用操作。 | なし。 | ||
| swap, std::swap | 過去終端イテレータが無効になることがある (実装定義)。 | ||
| shrink_to_fit, clear, insert, emplace, push_front, push_back, emplace_front, emplace_back |
常に。 | ||
| erase | 先頭で削除する場合 - 削除された要素のみ。 末尾で削除する場合 - 削除された要素と過去終端イテレータのみ。
| ||
| resize | 新しいサイズが古いサイズより小さい場合 - 削除された要素と 過去終端イテレータのみ。 新しいサイズが古いサイズより大きい場合 - すべてのイテレータが無効になる。 | ||
| pop_front, pop_back | 削除された要素へのイテレータ。 過去終端イテレータが無効になることがある (実装定義)。(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
|
| ||||
const_pointer
|
| ||||
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 を破棄する(公開メンバ関数) | |
| コンテナに値を代入する (公開メンバ関数) | |
| コンテナに値を代入する (公開メンバ関数) | |
| (C++23) |
コンテナに値の範囲を代入する (公開メンバ関数) |
| 関連付けられたアロケータを返す (公開メンバ関数) | |
要素アクセス | |
| 境界チェック付きで指定された要素にアクセスする (public メンバ関数) | |
| 指定された要素にアクセスする (public メンバ関数) | |
| 最初の要素にアクセスする (public メンバ関数) | |
| 最後の要素にアクセスする (public メンバ関数) | |
イテレータ | |
| (C++11) |
先頭へのイテレータを返す (public メンバ関数) |
| (C++11) |
末尾へのイテレータを返す (public メンバ関数) |
| (C++11) |
先頭への逆イテレータを返す (public メンバ関数) |
| (C++11) |
末尾への逆イテレータを返す (public メンバ関数) |
容量 | |
| コンテナが空かどうかをチェックする (public メンバ関数) | |
| 要素数を返す (public メンバ関数) | |
| 可能な最大要素数を返す (public メンバ関数) | |
| (DR*) |
未使用のメモリを解放してメモリ使用量を削減する (公開メンバ関数) |
変更 | |
| 内容をクリアする (公開メンバ関数) | |
| 要素を挿入する (公開メンバ関数) | |
| (C++23) |
要素の範囲を挿入する (公開メンバ関数) |
| (C++11) |
要素を直接構築する (公開メンバ関数) |
| 要素を削除する (公開メンバ関数) | |
| 末尾に要素を追加する (公開メンバ関数) | |
| (C++11) |
末尾に要素を直接構築する (公開メンバ関数) |
| (C++23) |
末尾に要素の範囲を追加する (公開メンバ関数) |
| 最後の要素を削除する (公開メンバ関数) | |
| 先頭に要素を挿入する (公開メンバ関数) | |
| (C++11) |
先頭に要素を直接構築する (公開メンバ関数) |
| (C++23) |
先頭に要素の範囲を追加する (公開メンバ関数) |
| 最初の要素を削除する (公開メンバ関数) | |
| 格納されている要素の数を変更する (公開メンバ関数) | |
| 内容を交換する (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 データ構造) を提供するためにコンテナを適応させる (クラステンプレート) |