名前空間
変種
操作

C++ 名前付き要件: AssociativeContainer

From cppreference.com
 
 
C++ 名前付き要件
 

AssociativeContainer とは、キーに基づいてオブジェクトの高速な検索を提供する、順序付けられた Container です。

連想コンテナが 一意のキー をサポートするのは、各キーに対して最大1つの要素しか含めない場合です。それ以外の場合は、同値キー をサポートします。

目次

[編集] 要件

凡例
X 連想コンテナクラス
T X の要素型
A X のアロケータ型: 存在する場合は X::allocator_type、それ以外の場合は std::allocator<X::value_type>
a X の値
a2 X と互換性のある ノードハンドル を持つ Y 型の値
b X または const X の値
u 宣言される変数の名前
a_uniq X が一意キーをサポートする場合の X の値
a_eq X が同値キーをサポートする場合の X の値
a_tran X::key_compare::is_transparent が存在する場合の X または const X の値
i, j X::value_type に暗黙的に変換可能な LegacyInputIterator
[ij) 有効な範囲
rg
(C++23から)
container-compatible-range<value_type> をモデル化する R 型の値
p a への有効な定数イテレータ
q a への有効な逆参照可能な定数イテレータ
r a への有効な逆参照可能なイテレータ
q1, q2 a 内の有効な定数イテレータの範囲
il X::value_typestd::initializer_list のオブジェクト
t X::value_type の値
k X::key_type の値
c X::key_compare または const X::key_compare の値
kl ac(x, kl) に関して分割されており、xe のキー値であり、ea 内にあるような値
ku a!c(ku, x) に関して分割されており、xe のキー値であり、ea 内にあるような値
ke ac(x, ke)!c(ke, x) に関して分割されており、c(x, ke)!c(ke, x) を含意し、xe のキー値であり、ea 内にあるような値
kx
(C++23から)
以下を満たす値:
  • ac(x, kx)!c(kx, x) に関して分割されており、c(x, kx)!c(kx, x) を含意し、xe のキー値であり、ea 内にある。
  • kxX::iterator または X::const_iterator のどちらにも変換できない。
m A に変換可能な型のアロケータ
nh X::node_type の非 const 右辺値

X は、以下の場合に AssociativeContainer を満たします。

  • XContainer(C++11まで)AllocatorAwareContainer(C++11以降) を満たす。
  • Key と、Key の要素上に strict weak ordering を誘導する順序関係 Compare をパラメータとする。
    • さらに、std::map および std::multimap は、Key に任意の マッピング型 T を関連付けます。
    • Compare のオブジェクトは、型 X のコンテナの 比較オブジェクト と呼ばれます。
  • すべての連想コンテナについて、以下の式は有効であり、指定された効果を持つ必要があります。

[編集]

名前 要件
key_type Key
mapped_type T (std::map および std::multimap のみ)
value_type
  • Key (std::set および std::multiset のみ)
  • std::pair<const Key, T> (std::map および std::multimap のみ)
X から Erasable
key_compare Compare CopyConstructible
value_compare
  • key_compare と同じ (std::set および std::multiset の場合)
  • ペアの順序関係で、第一成分(すなわち Key)によって誘導されるもの (std::map および std::multimap の場合)
BinaryPredicate
node_type node-handle クラステンプレート の特殊化。その公開されているネストされた型が、X の対応する型と同じ型である。

[編集] メンバ関数と演算子

Expression 結果 事前条件 効果 戻り値 計算量
X(c) 空のコンテナを構築します。c のコピーを比較オブジェクトとして使用します。 Constant
X u = X();
X u;
key_compareDefaultConstructible 要件を満たす。 空のコンテナを構築します。Compare() を比較オブジェクトとして使用します。 Constant
X(i, j, c) value_type は、*i から XEmplaceConstructible である。 空のコンテナを構築し、範囲 [ij) の要素を挿入します。c を比較オブジェクトとして使用します。 一般的に N·log(N)、ここで Nstd::distance(i, j) の値。範囲 [ij)value_comp() に関してソートされている場合は線形。
X(i, j) key_compareDefaultConstructible 要件を満たす。value_type は、*i から XEmplaceConstructible である。 空のコンテナを構築し、範囲 [ij) の要素を挿入します。Compare() を比較オブジェクトとして使用します。
X(from_range, rg, c)
(C++23から)
value_type は、*ranges::begin(rg) から XEmplaceConstructible である。 空のコンテナを構築し、rg の各要素を挿入します。c を比較オブジェクトとして使用します。 一般的に N·log(N)、ここで Nranges::distance(rg) の値。範囲 rgvalue_comp() に関してソートされている場合は線形。
X(from_range, rg)
(C++23から)
key_compareDefaultConstructible 要件を満たす。value_type は、*ranges::begin(rg) から XEmplaceConstructible である。 空のコンテナを構築し、rg の各要素を挿入します。Compare() を比較オブジェクトとして使用します。
X(il, c) X(il.begin(), il.end(), c)
X(il) X(il.begin(), il.end())
a = il X& value_typeXCopyInsertable であり、CopyAssignable である。 範囲 [il.begin()il.end())a に代入します。a の既存のすべての要素は、代入されるか破棄されます。 一般的に N·log(N)、ここで Nil.size() + a.size() の値。範囲 [il.begin()il.end())value_comp() に関してソートされている場合は線形。
b.key_comp() X::key_compare b が構築された比較オブジェクト Constant
b.value_comp() X::value_compare 比較オブジェクトから構築された value_compare のオブジェクト Constant
a_uniq.emplace(args) std::pair<
  iterator,
  bool>
value_type は、args から XEmplaceConstructible である。 value_type オブジェクト t を、std::forward<Args>(args)... で構築して挿入します。ただし、コンテナ内に t のキーと同値のキーを持つ要素が存在しない場合に限ります。 返されるペアの bool 成分は、挿入が行われた場合に true となり、ペアのイテレータ成分は t のキーと同値のキーを持つ要素を指します。 対数時間
a_eq.emplace(args) iterator value_type は、args から XEmplaceConstructible である。 value_type オブジェクト t を、std::forward<Args>(args)... で構築して挿入します。a_eq 内に t と同値の要素を持つ範囲が存在する場合、t はその範囲の末尾に挿入されます。 新しく挿入された要素を指すイテレータ 対数時間
a.emplace_hint(p, args) iterator 以下と等価です。

a.emplace(std::forward<Args>(args)...) と同様ですが、要素は p の直前の位置にできるだけ近い位置に挿入されます。

新しく挿入された要素と同値のキーを持つ要素を指すイテレータ 一般的に対数時間ですが、要素が p の直前に挿入される場合は償却定数時間。
a_uniq.insert(t) std::pair<
  iterator,
  bool>
t が非 const 右辺値の場合、value_typeXMoveInsertable であり、それ以外の場合、value_typeXCopyInsertable です。 t と同値のキーを持つ要素がコンテナ内に存在しない場合に限り、t を挿入します。 返されるペアの bool 成分は、挿入が行われた場合に true となり、iterator 成分は t のキーと同値のキーを持つ要素を指します。 対数時間
a_eq.insert(t) iterator t が非 const 右辺値の場合、value_typeXMoveInsertable であり、それ以外の場合、value_typeXCopyInsertable です。 t を挿入し、新しく挿入された要素を指すイテレータを返します。a_eq 内に t と同値の要素を持つ範囲が存在する場合、t はその範囲の末尾に挿入されます。 対数時間
a.insert(p, t) iterator t が非 const 右辺値の場合、value_typeXMoveInsertable であり、それ以外の場合、value_typeXCopyInsertable です。 一意キーを持つコンテナでは、t のキーと同値のキーを持つ要素が存在しない場合に限り t を挿入します。同値キーを持つコンテナでは常に t を挿入します。tp の直前の位置にできるだけ近い位置に挿入されます。 t のキーと同値のキーを持つ要素を指すイテレータ 一般的に対数時間ですが、tp の直前に挿入される場合は償却定数時間。
a.insert(i, j) void value_type は、*i から XEmplaceConstructible である。ija へのイテレータではない。 範囲 [ij) の各要素を、一意キーを持つコンテナではその要素のキーと同値のキーを持つ要素が存在しない場合に限り、同値キーを持つコンテナでは常に挿入します。 N·log(a.size() + N)、ここで Nstd::distance(i, j) の値。
a.insert_range(rg)
(C++23から)
void value_type は、*ranges::begin(rg) から XEmplaceConstructible である。rga は重複しない。 rg の各要素を、一意キーを持つコンテナではその要素のキーと同値のキーを持つ要素が存在しない場合に限り、同値キーを持つコンテナでは常に挿入します。 N·log(a.size() + N)、ここで Nranges::distance(rg) の値。
a.insert(il) a.insert(il.begin(), il.end())
a_uniq.insert(nh) insert_return_type nh が空であるか、または

a_uniq.get_allocator()
==
nh.get_allocator()true である。

nh が空の場合、効果はありません。それ以外の場合、nh が所有する要素を、コンテナ内に nh.key() と同値のキーを持つ要素が存在しない場合に限り挿入します。 nh が空の場合、insertedfalsepositionend()node は空です。それ以外の場合、挿入が行われた場合は insertedtrueposition は挿入された要素を指し、node は空です。挿入が失敗した場合は、insertedfalsenodenh の以前の値となり、positionnh.key() と同値のキーを持つ要素を指します。 対数時間
a_eq.insert(nh) iterator nh が空であるか、または

a_eq.get_allocator()
==
nh.get_allocator()true である。

nh が空の場合、効果はなく a_eq.end() を返します。それ以外の場合、nh が所有する要素を挿入し、新しく挿入された要素を指すイテレータを返します。a_eq 内に nh.key() と同値のキーを持つ要素の範囲が存在する場合、要素はその範囲の末尾に挿入されます。保証: nh は空になります。 対数時間
a.insert(p, nh) iterator nh が空であるか、または

a.get_allocator()
==
nh.get_allocator()true である。

nh が空の場合、効果はなく a.end() を返します。それ以外の場合、nh が所有する要素を、一意キーを持つコンテナでは nh.key() と同値のキーを持つ要素が存在しない場合に限り挿入します。同値キーを持つコンテナでは常に nh が所有する要素を挿入します。要素は p の直前の位置にできるだけ近い位置に挿入されます。保証: 挿入が成功した場合 nh は空になります。挿入が失敗した場合 nh は変更されません。 nh.key() と同値のキーを持つ要素を指すイテレータ 一般的に対数時間ですが、要素が p の直前に挿入される場合は償却定数時間。
a.extract(k) node_type コンテナ内で k と同値のキーを持つ最初の要素を削除します。 要素を所有する node_type (見つかった場合)、それ以外の場合は空の node_type log(a.size())
a_tran.extract(kx)
(C++23から)
node_type コンテナ内で r というキーを持つ最初の要素を削除します。ここで、!c(r, kx) && !c(kx, r)true となる。 要素を所有する node_type (見つかった場合)、それ以外の場合は空の node_type log(a_tran.size())
a.extract(q) node_type q が指す要素を削除します。 その要素を所有する node_type 償却定数時間
a.merge(a2) void a.get_allocator()
==
a2.get_allocator()
a2 内の各要素を抽出し、a の比較オブジェクトを使用して a に挿入しようとします。一意キーを持つコンテナでは、a2 の要素のキーと等しいキーを持つ要素が a に存在する場合、その要素は a2 から抽出されません。保証: 転送された a2 の要素へのポインタおよび参照は、それらを a のメンバとして参照し続けます。転送された要素を参照するイテレータは、それらの要素を参照し続けますが、それらは a2 ではなく a のイテレータとして動作します。例外: 比較オブジェクトが例外をスローしない限り、例外は発生しません。 N·log(a.size() + N)、ここで Na2.size() の値。
a.erase(k) size_type コンテナ内で k と同値のキーを持つすべての要素を削除します。 削除された要素の数 log(a.size())
+ a.count(k)
a_tran.erase(kx)
(C++23から)
size_type コンテナ内で r というキーを持つすべての要素を削除します。ここで、!c(r, kx) && !c(kx, r)true となる。 削除された要素の数 log(a_tran.size())
+ a_tran.count(kx)
a.erase(q) iterator q が指す要素を削除します。 削除される要素の直前に q が指していた要素の次の要素を指すイテレータ。そのような要素が存在しない場合は、a.end() を返します。 償却定数時間
a.erase(r) iterator r が指す要素を削除します。 削除される要素の直前に r が指していた要素の次の要素を指すイテレータ。そのような要素が存在しない場合は、a.end() を返します。 償却定数時間
a.erase(q1, q2) iterator 範囲内のすべての要素を削除します。
[q1q2)
要素が削除される前の q2 が指していた要素を指すイテレータ。そのような要素が存在しない場合は、a.end() が返されます。 log(a.size()) + N、ここで Nstd::distance(q1, q2) の値。
a.clear() a.erase(a.begin(), a.end())。保証: a.empty()true になる。 a.size() に関して線形。
b.find(k) iteratorb が const の場合は const_iterator k と同値のキーを持つ要素を指すイテレータ、またはそのような要素が見つからない場合は b.end() 対数時間
a_tran.find(ke) iteratora_tran が const の場合は const_iterator 以下を満たすキー r を持つ要素を指すイテレータ:

!c(r, ke) &&
!c(ke, r)true となる。または、そのような要素が見つからない場合は a_tran.end()

対数時間
b.count(k) size_type k と同値のキーを持つ要素の数。 log(b.size())
+ b.count(k)
a_tran.count(ke) size_type 以下を満たすキー r を持つ要素の数:

!c(r, ke) &&
!c(ke, r)

log(a_tran.size())
+ a_tran.count(ke)
b.contains(k) bool return b.find(k) != b.end();
a_tran.contains(ke) bool

return
  a_tran.find(ke) !=
  a_tran.end();

b.lower_bound(k) iteratorb が const の場合は const_iterator k 以上で最小のキーを持つ要素を指すイテレータ、またはそのような要素が見つからない場合は b.end() 対数時間
a_tran.lower_bound(kl) iteratora_tran が const の場合は const_iterator !c(r, kl) を満たす最初のキー r を持つ要素を指すイテレータ、またはそのような要素が見つからない場合は a_tran.end() 対数時間
b.upper_bound(k) iteratorb が const の場合は const_iterator k より大きいキーを持つ最初の要素を指すイテレータ、またはそのような要素が見つからない場合は b.end() 対数時間
a_tran.upper_bound(ku) iteratora_tran が const の場合は const_iterator c(ku, r) を満たす最初のキー r を持つ要素を指すイテレータ、またはそのような要素が見つからない場合は a_tran.end() 対数時間
b.equal_range(k) std::pair<
  iterator,
  iterator>
;

std::pair<
  const_iterator,
  const_iterator>
for constant b

以下と等価です。

return
  std::make_pair(
    b.lower_bound(k),
    b.upper_bound(k));

対数時間
a_tran.equal_range(ke) std::pair<
  iterator,
  iterator>
;

std::pair<
  const_iterator,
  const_iterator>
for constant a_tran

以下と等価です。

return
  std::make_pair(
    a_tran.lower_bound(ke),
    a_tran.upper_bound(ke));

対数時間

[編集] イテレータ

連想コンテナのイテレータは、LegacyBidirectionalIterator の要件を満たします。

value_typekey_type が同じである連想コンテナでは、iteratorconst_iterator は両方とも定数イテレータです。iteratorconst_iterator が同じ型であるかどうかは未規定です。

連想コンテナのイテレータは、コンテナの構築に使用された比較によって定義される非降順のキーの順序でコンテナを走査します。つまり、以下を与えられた場合:

  • a、連想コンテナ。
  • ija への逆参照可能なイテレータ。

i から j への距離が正の場合、a.value_comp()(*j, *i) == false。さらに、a が一意キーを持つ連想コンテナの場合、より強い条件 a.value_comp()(*i, *j) != false が成り立ちます。

[編集] 標準ライブラリ

以下の標準ライブラリコンテナは AssociativeContainer 要件を満たします。

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

[編集] 欠陥レポート

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

DR 適用対象 公開された動作 正しい動作
LWG 354 C++98 lower_boundupper_bound
要素が見つからない場合に end イテレータを返さない
この場合、end
イテレータを返す
LWG 589 C++98 ij が参照する要素
X::value_type 型であった
要素は暗黙的に
X::value_type に変換可能であった
English 日本語 中文(简体) 中文(繁體)