名前空間
変種
操作

コンテナライブラリ

From cppreference.com
< cpp

コンテナライブラリは、プログラマがキュー、リスト、スタックのような一般的なデータ構造を簡単に実装できるようにする、クラステンプレートとアルゴリズムの汎用的なコレクションです。コンテナには2つ(C++11まで)3つ(C++11から)のクラスがあります。

  • シーケンスコンテナ (sequence containers)、
  • 連想コンテナ (associative containers)、
  • 非順序連想コンテナ (unordered associative containers)、
(C++11以降)

それぞれが異なる操作のセットをサポートするように設計されています。

コンテナは、その要素のために割り当てられた記憶域を管理し、直接またはイテレータ(ポインタに似たプロパティを持つオブジェクト)を介して要素にアクセスするためのメンバ関数を提供します。

ほとんどのコンテナは、少なくともいくつかの共通のメンバ関数を持ち、機能を共有しています。特定のアプリケーションに最適なコンテナは、提供される機能だけでなく、さまざまなワークロードに対する効率にも依存します。

目次

[編集] シーケンスコンテナ

シーケンスコンテナは、シーケンシャルにアクセスできるデータ構造を実装します。

(C++11)
固定サイズのインプレースな連続配列
(クラステンプレート) [編集]
リサイズ可能な連続配列
(クラステンプレート) [編集]
リサイズ可能、固定容量、インプレースの連続配列
(クラステンプレート) [編集]
(C++26)
削除された要素のメモリを再利用するコレクション
(クラステンプレート) [編集]
両端キュー
(クラステンプレート) [編集]
単方向連結リスト
(クラステンプレート) [編集]
双方向リンクリスト
(クラステンプレート) [編集]

[編集] 連想コンテナ

連想コンテナは、高速に検索できるソート済みのデータ構造を実装します(計算量 O(log n))。

ユニークなキーのコレクション、キーによってソートされる
(class template) [編集]
キーでソートされたキーと値のペアのコレクション、キーは一意
(クラステンプレート) [編集]
キーによってソートされたキーのコレクション
(クラステンプレート) [編集]
キーによってソートされたキーと値のペアのコレクション
(クラステンプレート) [編集]

[編集] 非順序連想コンテナ (C++11から)

非順序連想コンテナは、高速に検索できるソートされていない(ハッシュ化された)データ構造を実装します(平均計算量 O(1)、最悪計算量 O(n))。

キーによってハッシュ化されたユニークなキーのコレクション
(クラステンプレート) [編集]
キーによってハッシュ化されたキーと値のペアのコレクション、キーはユニーク
(クラステンプレート) [編集]
キーのコレクション、キーによってハッシュ化される
(class template) [編集]
キーでハッシュ化されたキーと値のペアのコレクション
(クラステンプレート) [編集]

[編集] コンテナアダプタ

コンテナアダプタは、シーケンスコンテナに対して異なるインターフェースを提供します。

コンテナをスタック(LIFOデータ構造)として提供するよう適合させる
(クラステンプレート) [編集]
キュー (FIFO データ構造) を提供するためにコンテナを適応させる
(クラステンプレート) [編集]
コンテナを優先度付きキューとして提供するよう適合させる
(クラステンプレート) [編集]
(C++23)
ユニークなキーのコレクションを提供するためにコンテナを適応させる、キーによってソートされる
(class template) [編集]
(C++23)
ユニークなキーによってソートされたキーと値のペアのコレクションを提供するために2つのコンテナを適合させる
(クラステンプレート) [編集]
コンテナを適応させ、キーでソートされたキーのコレクションを提供する
(クラステンプレート) [編集]
2つのコンテナを適応させて、キーでソートされたキーと値のペアのコレクションを提供する
(クラステンプレート) [編集]

[編集] ビュー (C++20から)

ビューは、所有権を持たない要素の配列に対する1次元または多次元のビューを操作するための柔軟な機能を提供します。

(C++20)
連続したオブジェクトのシーケンスに対する所有権を持たないビュー
(class template) [編集]
(C++23)
多次元の所有権を持たない配列ビュー
(クラステンプレート) [編集]

[編集] イテレータの無効化

読み取り専用メソッドは、イテレータや参照を無効化することはありません。コンテナの内容を変更するメソッドは、この表に要約されているように、イテレータや参照を無効化する可能性があります。

カテゴリ コンテナ 挿入後、...は 削除後、...は 条件付き
イテレータは有効か? 参照は有効か? イテレータは有効か? 参照は有効か?
シーケンスコンテナ array N/A N/A
vector いいえ N/A 挿入によりcapacityが変更された
はい はい 変更された要素より前
(挿入の場合、capacityが変更されなかった場合のみ)
いいえ いいえ 変更された要素以降
deque いいえ はい はい、ただし削除された要素を除く 先頭または末尾の要素が変更された
いいえ いいえ 中間の要素のみが変更された
list はい はい、ただし削除された要素を除く
forward_list はい はい、ただし削除された要素を除く
連想コンテナ set
multiset
map
multimap
はい はい、ただし削除された要素を除く
非順序連想コンテナ unordered_set
unordered_multiset
unordered_map
unordered_multimap
いいえ はい N/A 挿入によりリハッシュが発生した
はい はい、ただし削除された要素を除く リハッシュなし

ここで、挿入とはコンテナに1つ以上の要素を追加する任意のメソッドを指し、削除とはコンテナから1つ以上の要素を削除する任意のメソッドを指します。

  • std::unordered_map::operator[] はマップに要素を挿入する可能性があるため、これも挿入メソッドに含まれることに注意してください。
(C++11以降)

別途指定されない限り(明示的に、または他の関数を用いて関数を定義することによって)、コンテナをライブラリ関数に引数として渡しても、そのコンテナ内のオブジェクトへのイテレータを無効化したり、値を変更したりすることはありません。

過去終端イテレータ(past-the-end iterator)は特に注意が必要です。一般に、このイテレータは削除されていない要素への通常のイテレータであるかのように無効化されます。したがって、std::set::end は決して無効化されずstd::unordered_set::end はリハッシュ時にのみ無効化され(C++11から)std::vector::end は(常に変更された要素の後にあるため)常に無効化されます。

1つの例外があります。std::deque の最後の要素を削除する操作は、過去終端イテレータを無効化します。これは、そのイテレータがコンテナの削除された要素(あるいは要素ですら)ではないにもかかわらずです。std::deque のイテレータに関する一般規則と合わせると、結果として std::deque::end を無効化しない唯一の変更操作は、最後の要素ではなく最初の要素を削除する操作だけです。

スレッドセーフティ

  1. すべてのコンテナ関数は、異なるコンテナに対して異なるスレッドから同時に呼び出すことができます。より一般的には、C++標準ライブラリ関数は、thisポインタを含む関数の引数を介して直接または間接的にアクセス可能でない限り、他のスレッドからアクセス可能なオブジェクトを読み取りません。
  2. すべての const メンバ関数は、同じコンテナに対して異なるスレッドから同時に呼び出すことができます。さらに、メンバ関数 begin(), end(), rbegin(), rend(), front(), back(), data(), find(), lower_bound(), upper_bound(), equal_range(), at()、および連想コンテナを除く operator[] は、スレッドセーフティの目的上 const として振る舞います(つまり、これらも同じコンテナに対して異なるスレッドから同時に呼び出すことができます)。より一般的には、C++標準ライブラリ関数は、thisポインタを含む関数の非const引数を介して直接または間接的にアクセス可能でない限り、オブジェクトを変更しません。
  3. 同じコンテナ内の異なる要素は、std::vector<bool> の要素を除き、異なるスレッドによって同時に変更できます(例えば、std::future オブジェクトのベクタは、複数のスレッドから値を受け取ることができます)。
  4. イテレータ操作(例:イテレータのインクリメント)は、基になるコンテナを読み取りますが変更はせず、同じコンテナ上の他のイテレータに対する操作、constメンバ関数、または要素からの読み取りと同時に実行できます。イテレータを無効化するコンテナ操作はコンテナを変更するため、たとえそのイテレータが無効化されない場合でも、既存のイテレータに対するいかなる操作とも同時に実行することはできません。
  5. 同じコンテナの要素は、これらの要素にアクセスしないと規定されているメンバ関数と同時に変更できます。より一般的には、C++標準ライブラリ関数は、仕様で要求されない限り、引数を介して間接的にアクセス可能なオブジェクト(コンテナの他の要素を含む)を読み取りません。
  6. いずれの場合も、コンテナ操作(アルゴリズムやその他のC++標準ライブラリ関数も同様)は、ユーザーから見える結果が変わらない限り、内部的に並列化されることがあります(例:std::transform は並列化される可能性がありますが、シーケンスの各要素を順番に訪れると規定されている std::for_each は並列化されません)。
(C++11以降)

[編集] 関数テーブル

注意:std::basic_string は標準ではコンテナとして扱われませんが、その類似性からコンテナのように振る舞います。便宜上、ここでは「疑似コンテナ」として記載しています。

- C++03に存在する関数
- C++11から存在する関数
- C++17から存在する関数
- C++20から存在する関数
- C++23から存在する関数

[編集] メンバ関数テーブル

疑似コンテナ シーケンスコンテナ 連想コンテナ 非順序連想コンテナ コンテナアダプタ
ヘッダ <string> <array> <vector> <deque> <forward_list> <list> <set> <map> <unordered_set> <unordered_map> <stack> <queue> <flat_set> <flat_map> ヘッダ
コンテナ
basic_string
array
vector
deque
forward_list
list
set
multiset
map
multimap
unordered_set
unordered_multiset
unordered_map
unordered_multimap
stack
queue
priority_queue
flat_set
flat_multiset
flat_map
flat_multimap
コンテナ
(コンストラクタ)
basic_string
(暗黙)
vector
deque
forward_list
list
set
multiset
map
multimap
unordered_set
unordered_multiset
unordered_map
unordered_multimap
stack
queue
priority_queue
flat_set
flat_multiset
flat_map
flat_multimap
(コンストラクタ)
(デストラクタ)
~basic_string
(暗黙)
~vector
~deque
~forward_list
~list
~set
~multiset
~map
~multimap
~unordered_set
~unordered_multiset
~unordered_map
~unordered_multimap
~stack
~queue
~priority_queue
~flat_set
~flat_multiset
~flat_map
~flat_multimap
(デストラクタ)
operator=
operator=
(暗黙)
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
代入する
代入する
代入する
代入する
代入する
代入する
代入する
assign_range
assign_range
assign_range
assign_range
assign_range
assign_range
assign_range
イテレータ
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
イテレータ
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
要素
アクセス
at
at
at
at
at
at
at
at
at
要素
アクセス
operator[]
operator[]
operator[]
operator[]
operator[]
operator[]
operator[]
operator[]
operator[]
data
data
data
data
data
front
front
front
front
front
front
front
front
top
front
back
back
back
back
back
back
top
back
back
容量
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
容量
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
resize
resize
resize
resize
resize
resize
resize
capacity
capacity
capacity
capacity
reserve
reserve
reserve
reserve
reserve
reserve
reserve
reserve
shrink_to_fit
shrink_to_fit
shrink_to_fit
shrink_to_fit
shrink_to_fit
変更
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
変更
insert
insert
insert
insert
insert_after
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert_range
insert_range
insert_range
insert_range
insert_range_after
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_or_assign
insert_or_assign
insert_or_assign
insert_or_assign
insert_or_assign
emplace
emplace
emplace
emplace_after
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
try_emplace
try_emplace
try_emplace
try_emplace
try_emplace
erase
erase
erase
erase
erase_after
erase
erase
erase
erase
erase
erase
erase
erase
erase
erase
erase
erase
erase
erase
push_front
push_front
push_front
push_front
push_front
prepend_range
prepend_range
prepend_range
prepend_range
prepend_range
emplace_front
emplace_front
emplace_front
emplace_front
emplace_front
pop_front
pop_front
pop_front
pop_front
pop
pop
pop_front
push_back
push_back
push_back
push_back
push_back
push
push
push
push_back
append_range
append_range
append_range
append_range
append_range
push_range
push_range
push_range
append_range
emplace_back
emplace_back
emplace_back
emplace_back
emplace
emplace
emplace
emplace_back
pop_back
pop_back
pop_back
pop_back
pop_back
pop
pop_back
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
merge
merge
merge
merge
merge
merge
merge
merge
merge
merge
merge
merge
extract [1]
extract
extract
extract
extract
extract
extract
extract
extract
extract
リスト操作
splice
splice_after
splice
splice
リスト操作
remove
remove
remove
remove
remove_if
remove_if
remove_if
remove_if
reverse
reverse
reverse
reverse
unique
unique
unique
unique
sort
sort
sort
sort
バケットとハッシュ
begin(size_type)
cbegin(size_type)
begin(size_type)
cbegin(size_type)
begin(size_type)
cbegin(size_type)
begin(size_type)
cbegin(size_type)
begin(size_type)
cbegin(size_type)
begin(size_type)
cbegin(size_type)
バケットとハッシュ
end(size_type)
cend(size_type)
end(size_type)
cend(size_type)
end(size_type)
cend(size_type)
end(size_type)
cend(size_type)
end(size_type)
cend(size_type)
end(size_type)
cend(size_type)
bucket_count
bucket_count
bucket_count
bucket_count
bucket_count
bucket_count
max_bucket_count
max_bucket_count
max_bucket_count
max_bucket_count
max_bucket_count
max_bucket_count
bucket_size
bucket_size
bucket_size
bucket_size
bucket_size
bucket_size
bucket
bucket
bucket
bucket
bucket
bucket
load_factor
load_factor
load_factor
load_factor
load_factor
load_factor
max_load_factor
max_load_factor
max_load_factor
max_load_factor
max_load_factor
max_load_factor
rehash
rehash
rehash
rehash
rehash
rehash
検索
count
count
count
count
count
count
count
count
count
count
count
count
count
count
検索
find
find
find
find
find
find
find
find
find
find
find
find
find
find
find
contains
contains
contains
contains
contains
contains
contains
contains
contains
contains
contains
contains
contains
contains
contains
lower_bound
lower_bound
lower_bound
lower_bound
lower_bound
lower_bound
lower_bound
lower_bound
lower_bound
lower_bound
upper_bound
upper_bound
upper_bound
upper_bound
upper_bound
upper_bound
upper_bound
upper_bound
upper_bound
upper_bound
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
監視
key_comp
key_comp
key_comp
key_comp
key_comp
key_comp
key_comp
key_comp
key_comp
key_comp
監視
value_comp
value_comp
value_comp
value_comp
value_comp
value_comp
value_comp
value_comp
value_comp
value_comp
hash_function
hash_function
hash_function
hash_function
hash_function
hash_function
key_eq
key_eq
key_eq
key_eq
key_eq
key_eq
アロケータ
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
アロケータ
アダプタ
extract [2]
extract
extract
extract
extract
extract
アダプタ
replace
replace
replace
replace
replace
replace
コンテナ
basic_string
array
vector
deque
forward_list
list
set
multiset
map
multimap
unordered_set
unordered_multiset
unordered_map
unordered_multimap
stack
queue
priority_queue
flat_set
flat_multiset
flat_map
flat_multimap
コンテナ
ヘッダ <string> <array> <vector> <deque> <forward_list> <list> <set> <map> <unordered_set> <unordered_map> <stack> <queue> <flat_set> <flat_map> ヘッダ
疑似コンテナ シーケンスコンテナ 連想コンテナ 非順序連想コンテナ コンテナアダプタ
  • 注意:2つの異なる extract 行にある関数は、意味と構文が異なります
  1. 例:node_type extract(const_iterator) または node_type extract(Key&)
  2. 例:container_type extract() &&

[編集] 非メンバ関数テーブル

疑似コンテナ シーケンスコンテナ 連想コンテナ 非順序連想コンテナ コンテナアダプタ
ヘッダ <string> <array> <vector> <deque> <forward_list> <list> <set> <map> <unordered_set> <unordered_map> <stack> <queue> <flat_set> <flat_map> ヘッダ
コンテナ
basic_string
array
vector
deque
forward_list
list
set
multiset
map
multimap
unordered_set
unordered_multiset
unordered_map
unordered_multimap
stack
queue
priority_queue
flat_set
flat_multiset
flat_map
flat_multimap
コンテナ
非メンバ関数
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
非メンバ関数
operator!= (C++20で削除)
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!= (C++20で削除)
operator< (C++20で削除)
operator<
operator<
operator<
operator<
operator<
operator<
operator<
operator<
operator<
operator<
operator<
operator<
operator< (C++20で削除)
operator<= (C++20で削除)
operator<=
operator<=
operator<=
operator<=
operator<=
operator<=
operator<=
operator<=
operator<=
operator<=
operator<=
operator<=
operator<= (C++20で削除)
operator> (C++20で削除)
operator>
operator>
operator>
operator>
operator>
operator>
operator>
operator>
operator>
operator>
operator>
operator>
operator> (C++20で削除)
operator>= (C++20で削除)
operator>=
operator>=
operator>=
operator>=
operator>=
operator>=
operator>=
operator>=
operator>=
operator>=
operator>=
operator>=
operator>= (C++20で削除)
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
erase
erase
erase
erase
erase
erase
erase
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
コンテナ
basic_string
array
vector
deque
forward_list
list
set
multiset
map
multimap
unordered_set
unordered_multiset
unordered_map
unordered_multimap
stack
queue
priority_queue
flat_set
flat_multiset
flat_map
flat_multimap
コンテナ
ヘッダ <string> <array> <vector> <deque> <forward_list> <list> <set> <map> <unordered_set> <unordered_map> <stack> <queue> <flat_set> <flat_map> ヘッダ
疑似コンテナ シーケンスコンテナ 連想コンテナ 非順序連想コンテナ コンテナアダプタ

<, <=, >, >=, != 演算子は、それぞれ operator<=>operator== から合成されます。

(C++20以降)

[編集] 欠陥報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 51 C++98 コンテナのイテレータが無効化される可能性がある
任意のライブラリ操作によって
イテレータは無効化されるのは
指定された場合のみ

[編集] 関連項目

C++ 名前付き要件

数値配列、配列マスク、および配列スライス
(クラステンプレート) [編集]
文字のシーケンスを格納し操作する
(クラステンプレート) [編集]
読み取り専用の文字列ビュー
(class template) [編集]
English 日本語 中文(简体) 中文(繁體)