Skip to content

Latest commit

 

History

History
196 lines (148 loc) · 10.9 KB

deque.md

File metadata and controls

196 lines (148 loc) · 10.9 KB

deque

  • deque[meta header]
  • std[meta namespace]
  • class template[meta id-type]
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から
  }
}
  • allocator[link /reference/memory/allocator.md]
  • polymorphic_allocator[link /reference/memory_resource/polymorphic_allocator.md]

概要

deque(通常、"デック"のように発音する)はdouble-ended queue (二重終端キュー)の頭文字をとったものである。double-ended queue はシーケンスコンテナの一種である。要素は厳密な線形シーケンスに従って並べられる。

deque はライブラリによってさまざまな方法で実装されるかもしれないが、全ての場合においてランダムアクセスイテレータを介して個々の要素へアクセス可能であり、ストレージは(必要に応じて拡大または縮小して)自動的に処理される。

deque シーケンスは以下の特性を持つ。

  • 個々の要素はその位置インデックスによってアクセスすることができる。
  • 要素のイテレーションは任意の順序で実行することができる。
  • 要素はいずれの端(シーケンスの先頭または最後)からも効率よく追加・削除される。

従ってこれは vector と同様の機能を提供するが、シーケンスの終端だけでなく先頭への効率的な挿入・削除を共に提供する。vector とは異なる欠点として deque は連続した位置のストレージに全ての要素を持つことを保証していないため、ポインタ演算を介しての安全なアクセスの可能性を排除する。

vectordeque は共に類似したインターフェイスを提供するため、類似した目的に利用することができるが、内部的にはかなり異なった方法で動作する。vector は通常の配列と非常によく似ており、容量が使い果たされるときにはブロック内の全ての要素を再配置することによって拡張する。deque は全ての情報を保持しつつ要素への均一なアクセスを提供することで、要素をストレージのいくつかのチャンクに分割することができる。従って deque の内部は少し複雑であるが、これは特に大規模なシーケンスにおいて大規模な再配置が回避されることを許すため、一般に容量増加の自動管理を vector より効率的に行うことを可能にする。

テンプレートパラメータは、以下を意味する:

  • T : 要素の型。
  • Allocator : ストレージの割り当てモデルを定義するために使用されるアロケータオブジェクトの型。デフォルトでは、値に依存しない単純なメモリ割り当てモデルを定義する、型 Tallocator クラステンプレートが使われる。

メンバ関数

構築/コピー/破棄

名前 説明 対応バージョン
(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;
  });
}
  • std::deque[color ff0000]
  • deq.push_front[link deque/push_front.md]
  • deq.push_back[link deque/push_back.md]
  • deq.begin()[link deque/begin.md]
  • deq.end()[link deque/end.md]

出力

3
1

参照