namespace std {
template <class T, class Allocator = allocator<T>>
class deque;
namespace pmr {
template <class T>
using deque = std::deque<T, polymorphic_allocator<T>>; // C++17から
}
}
概要
deque
(通常、"デック"のように発音する)はdouble-ended queue (二重終端キュー)の頭文字をとったものである。double-ended queue はシーケンスコンテナの一種である。要素は厳密な線形シーケンスに従って並べられる。
deque
はライブラリによってさまざまな方法で実装されるかもしれないが、全ての場合においてランダムアクセスイテレータを介して個々の要素へアクセス可能であり、ストレージは(必要に応じて拡大または縮小して)自動的に処理される。
deque
シーケンスは以下の特性を持つ。
- 個々の要素はその位置インデックスによってアクセスすることができる。
- 要素のイテレーションは任意の順序で実行することができる。
- 要素はいずれの端(シーケンスの先頭または最後)からも効率よく追加・削除される。
従ってこれは vector
と同様の機能を提供するが、シーケンスの終端だけでなく先頭への効率的な挿入・削除を共に提供する。vector
とは異なる欠点として deque
は連続した位置のストレージに全ての要素を持つことを保証していないため、ポインタ演算を介しての安全なアクセスの可能性を排除する。
vector
と deque
は共に類似したインターフェイスを提供するため、類似した目的に利用することができるが、内部的にはかなり異なった方法で動作する。vector
は通常の配列と非常によく似ており、容量が使い果たされるときにはブロック内の全ての要素を再配置することによって拡張する。deque
は全ての情報を保持しつつ要素への均一なアクセスを提供することで、要素をストレージのいくつかのチャンクに分割することができる。従って deque
の内部は少し複雑であるが、これは特に大規模なシーケンスにおいて大規模な再配置が回避されることを許すため、一般に容量増加の自動管理を vector
より効率的に行うことを可能にする。
テンプレートパラメータは、以下を意味する:
T
: 要素の型。Allocator
: ストレージの割り当てモデルを定義するために使用されるアロケータオブジェクトの型。デフォルトでは、値に依存しない単純なメモリ割り当てモデルを定義する、型T
のallocator
クラステンプレートが使われる。
メンバ関数
構築/コピー/破棄
名前 | 説明 | 対応バージョン |
---|---|---|
(constructor) |
コンストラクタ | |
(destructor) |
デストラクタ | |
operator= |
代入演算子 | |
assign |
コンテナに値を代入する | |
assign_range |
コンテナにRangeの要素を代入する | C++23 |
get_allocator |
アロケータオブジェクトを取得する |
要素アクセス
名前 | 説明 | 対応バージョン |
---|---|---|
at |
任意位置の要素への参照を取得する | |
operator[] |
任意位置の要素への参照を取得する | |
front |
先頭要素への参照を取得する | |
back |
末尾要素への参照を取得する |
イテレータ
名前 | 説明 | 対応バージョン |
---|---|---|
begin |
先頭要素を指すイテレータの取得する | |
end |
末尾要素の次を指すイテレータを取得する | |
cbegin |
先頭要素を指す読み取り専用イテレータを取得する | C++11 |
cend |
末尾要素の次を指す読み取り専用イテレータを取得する | C++11 |
rbegin |
末尾要素を指す逆イテレータを取得する | |
rend |
先頭要素の前を指す逆イテレータを取得する | |
crbegin |
末尾要素を指す読み取り専用逆イテレータを取得する | C++11 |
crend |
先頭要素の前を指す読み取り専用逆イテレータを取得する | C++11 |
領域
名前 | 説明 | 対応バージョン |
---|---|---|
empty |
コンテナが空であるかどうかを調べる | |
size |
要素数を取得する | |
max_size |
格納可能な最大の要素数を取得する | |
shrink_to_fit |
利用していないメモリを解放してメモリ使用量を減らす | C++11 |
コンテナの変更
名前 | 説明 | 対応バージョン |
---|---|---|
clear |
全ての要素を削除する | |
insert |
任意の位置に要素を挿入する | |
emplace |
任意の位置に要素を直接構築で挿入する | C++11 |
insert_range |
任意の位置にRangeの要素を挿入する | C++23 |
push_back |
末尾に要素を追加する | |
emplace_back |
末尾に要素を直接構築で追加する | C++11 |
append_range |
末尾にRangeの要素を追加する | C++23 |
pop_back |
末尾要素を削除する | |
push_front |
先頭に要素を追加する | |
emplace_front |
先頭に要素を直接構築で追加する | C++11 |
prepend_range |
先頭にRangeの要素を追加する | C++23 |
pop_front |
先頭要素を削除する | |
resize |
要素数を変更する | |
erase |
指定した要素を削除する | |
swap |
他のdeque オブジェクトとデータを入れ替える |
メンバ型
名前 | 説明 | 対応バージョン |
---|---|---|
reference |
T& |
|
const_reference |
const T& |
|
iterator |
イテレータ型。ランダムアクセスイテレータ | |
const_iterator |
読み取り専用イテレータ型ランダムアクセスイテレータ | |
size_type |
符号なし整数型(通常は size_t ) |
|
difference_type |
符号付き整数型(通常は ptrdiff_t ) |
|
value_type |
T |
|
allocator_type |
Allocator |
|
pointer |
allocator_traits<Allocator>::pointer |
|
const_iterator |
allocator_traits<Allocator>::const_pointer |
|
reverse_iterator |
逆イテレータ型 reverse_iterator<iterator> |
|
const_reverse_iterator |
読み取り専用逆イテレータ型 reverse_iterator<const_iterator> |
非メンバ関数
比較演算子
名前 | 説明 | 対応バージョン |
---|---|---|
operator== |
等値比較 | |
operator!= |
非等値比較 | |
operator<=> |
三方比較 | C++20 |
operator< |
左辺が右辺より小さいかの判定を行う | |
operator<= |
左辺が右辺以下かの判定を行う | |
operator> |
左辺が右辺より大きいかの判定を行う | |
operator>= |
左辺が右辺以上かの判定を行う |
入れ替え
名前 | 説明 | 対応バージョン |
---|---|---|
swap |
2つのdeque オブジェクトを入れ替える |
要素削除
名前 | 説明 | 対応バージョン |
---|---|---|
erase |
指定した値をもつ要素とその分の領域を、コンテナから削除する | C++20 |
erase_if |
指定した条件に合致する要素とその分の領域を、コンテナから削除する | C++20 |
推論補助
名前 | 説明 | 対応バージョン |
---|---|---|
(deduction_guide) |
クラステンプレートの推論補助 | C++17 |
例
#include <iostream>
#include <deque>
#include <algorithm>
int main()
{
std::deque<int> deq;
deq.push_front(3); // 先頭に要素を追加
deq.push_back(1); // 末尾に要素を追加
// イテレータを介して全要素に対して操作を行う
std::for_each(deq.begin(), deq.end(), [](int x) {
std::cout << x << std::endl;
});
}
xxxxxxxxxx
#include <iostream>
#include <deque>
#include <algorithm>
int main()
{
std::deque<int> deq;
deq.push_front(3); // 先頭に要素を追加
deq.push_back(1); // 末尾に要素を追加
// イテレータを介して全要素に対して操作を行う
std::for_each(deq.begin(), deq.end(), [](int x) {
std::cout << x << std::endl;
});
}
出力
3
1