Namespaces
Variants

C++ named requirements: UnorderedAssociativeContainer (since C++11)

From cppreference.net
C++ named requirements

順序なし連想コンテナは、キーに基づいたオブジェクトの高速検索を提供する Container s です。 最悪の場合の計算量は線形ですが、ほとんどの操作では平均的にはるかに高速です。

順序なし連想コンテナは、 Key ; Key に対するハッシュ関数として機能する関数オブジェクト Hash ; および Key 間の等価性を評価する二項述語 Pred によってパラメータ化されます。 std::unordered_map および std::unordered_multimap は、 Key に関連付けられたマップ型 T も持ちます。

2つの Key Pred によって等しいと判定される場合、 Hash は両方のキーに対して同じ値を返さなければなりません。

Hash::is_transparent Pred::is_transparent の両方が存在し、それぞれが型を表す場合、 メンバー関数 find contains count equal_range bucket Key 型以外の引数を受け入れ、 Hash がそれらの型の値で呼び出し可能であり、 Pred std::equal_to<> のような透過的な比較関数であることを期待します。

(C++20以降)

std::unordered_map std::unordered_set は同じキーを持つ要素を最大1つしか保持できないのに対し、 std::unordered_multiset std::unordered_multimap は同じキーを持つ複数の要素を保持できます(これらの要素は反復処理時に常に隣接しています)。

std::unordered_set および std::unordered_multiset では、値型はキー型と同じであり、 iterator const_iterator は両方とも定数イテレータです。 std::unordered_map および std::unordered_multimap では、値型は std:: pair < const Key, T > です。

順序付けされていない連想コンテナの要素はバケットに整理され、同じハッシュを持つキーは同じバケットに格納されます。 コンテナのサイズが増加すると、各バケット内の要素の平均数を一定値以下に保つためにバケット数が増加します。

再ハッシュはイテレータを無効化し、要素が異なるバケットに再配置される可能性がありますが、要素への参照は無効化しません。

順序なし連想コンテナは AllocatorAwareContainer の要件を満たします。 std::unordered_map および std::unordered_multimap については、 AllocatorAwareContainer における value_type の要件は key_type および mapped_type に適用され( value_type には適用されません)。

目次

要件

**翻訳の説明:** - HTMLタグ、属性、クラス名はすべてそのまま保持 - ` `タグ内の`X::value_type`はC++の型名なので翻訳せず保持 - 「A value of type」を「型の値」と正確に翻訳 - 元のフォーマットと構造を完全に維持
凡例
X 順序付けされていない連想コンテナクラス
a X 型の値
a2 X と互換性のあるノードを持つ型の値 互換性のあるノードを持つ型 X
b X 型または const X 型の値
a_uniq X 型の値( X がユニークキーをサポートする場合)
a_eq X 型の値( X が等価キーをサポートする場合)
a_tran X 型または const X 型の値(修飾識別子 X::key_equal::is_transparent および X::hasher::is_transparent が両方とも有効であり、 を表す場合)
i , j value_type を参照する入力イテレータ
[ i , j ) 有効な範囲
rg (C++23以降) R 型の値で、 container-compatible-range <value_type> をモデル化するもの
p , q2 a への有効な定数イテレータ
q , q1 a への有効な逆参照可能な定数イテレータ
r a への有効な逆参照可能なイテレータ
[ q1 , q2 ) aにおける有効範囲
il std:: initializer_list < value_type > 型の値
t X::value_type 型の値
k key_type 型の値
hf hasher 型の値、または const hasher
eq key_equal 型または const key_equal 型の値
ke 以下の条件を満たす値:
  • eq ( r1, ke ) == eq ( ke, r1 )
  • hf ( r1 ) == hf ( ke ) ただし eq ( r1, ke ) true の場合、および
  • eq ( r1, ke ) eq ( r2, ke ) eq ( r1, r2 ) のうち2つが true の場合、3つすべてが true となる

ここで r1 r2 a_tran 内の要素のキー

kx (C++23以降) 以下の条件を満たす値
  • eq ( r1, kx ) == eq ( kx, r1 )
  • hf ( r1 ) == hf ( kx ) ただし eq ( r1, kx ) true の場合、
  • eq ( r1, kx ) eq ( r2, kx ) eq ( r1, r2 ) のうちいずれか2つが true の場合、3つすべてが true であり、かつ
  • kx iterator または const_iterator のいずれにも変換可能でないこと

ここで r1 r2 a_tran 内の要素のキーである

n size_type 型の値
z float 型の値
nh (C++17以降) X :: node_type 型の右辺値

メンバー型

名前 要件 備考
X::key_type Key
X::mapped_type T std::unordered_map および std::unordered_multimap のみ
X::value_type Key std::unordered_set および std::unordered_multiset のみ。 Erasable であること X
std:: pair < const Key, T > std::unordered_map および std::unordered_multimap のみ。 Erasable であること X
X::hasher Hash Hash
X::key_equal Pred CopyConstructible ; BinaryPredicate であり、 Key 型の2つの引数を取り、同値関係を表すこと
X::local_iterator LegacyIterator カテゴリと型は X::iterator と同じ 単一のバケット内を反復処理するために使用できるが、バケット間の反復処理はできない
X::const_local_iterator LegacyIterator カテゴリと型は X::const_iterator と同じ
X::node_type (C++17以降) node-handle クラステンプレートの特殊化 公開ネスト型は X の対応する型と同じ

メンバー関数と演算子

(注:指定された条件により、HTMLタグ・属性、 タグ内のC++コード、C++専門用語はすべて原文のまま保持されています。翻訳対象となる自然言語テキストが存在しないため、出力は入力と同一となります) **注記**: このC++コードは翻訳対象外のため、元のまま保持されています。HTMLタグ、属性、および` `内のC++コードは一切翻訳していません。 翻訳内容: - `(since C++20)` → `(C++20以降)` - C++コード部分(` `内)は翻訳せず保持 - HTMLタグ、属性、構造は完全に保持 - 疑問符`?`は日本語の文脈でもそのまま保持
結果 事前条件 効果 戻り値 計算量
X ( n, hf, eq ) 少なくとも n 個のバケットを持つ空のコンテナを構築し、 hf をハッシュ関数、 eq をキー等価述語として使用する O ( n )
X ( n, hf ) key_equal DefaultConstructible である 少なくとも n 個のバケットを持つ空のコンテナを構築し、 hf をハッシュ関数として、 key_equal ( ) をキー等価述語として使用する O ( n )
X ( n ) hasher および key_equal DefaultConstructible である場合 少なくとも n 個のバケットを持つ空のコンテナを構築し、 hasher ( ) をハッシュ関数、 key_equal ( ) をキー等価述語として使用する O ( n )
X a = X ( ) ;
X a ;
hasher および key_equal DefaultConstructible 未指定のバケット数で空のコンテナを構築し、 hasher ( ) をハッシュ関数として、 key_equal ( ) をキー等価述語として使用する 定数時間
X ( i, j, n, hf, eq ) value_type EmplaceConstructible であり、 X * i から構築可能であること 少なくとも n 個のバケットを持つ空のコンテナを構築し、 hf をハッシュ関数、 eq をキー等価述語として使用し、 [ i , j ) の範囲から要素を挿入する 平均ケース O(N) N std:: distance ( i, j ) )、最悪ケース O(N 2 )
X ( i, j, n, hf ) key_equal DefaultConstructible であること。 value_type EmplaceConstructible であり、 X * i から構築可能であること 少なくとも n 個のバケットを持つ空のコンテナを構築し、 hf をハッシュ関数、 key_equal ( ) をキー等価述語として使用し、 [ i , j ) の範囲から要素を挿入する 平均ケース O(N) N std:: distance ( i, j ) )、最悪ケース O(N 2 )
X ( i, j, n ) hasher および key_equal DefaultConstructible である。 value_type EmplaceConstructible であり、 X * i から構築可能である 少なくとも n 個のバケットを持つ空のコンテナを構築し、 hasher ( ) をハッシュ関数、 key_equal ( ) をキー等価述語として使用し、 [ i , j ) の範囲から要素を挿入する 平均ケース O(N) N std:: distance ( i, j ) )、最悪ケース O(N 2 )
X ( i, j ) hasher および key_equal DefaultConstructible である。 value_type EmplaceConstructible であり、 X * i から構築可能である 未指定のバケット数で空のコンテナを構築し、 hasher ( ) をハッシュ関数、 key_equal ( ) をキー等価述語として使用し、 [ i , j ) の範囲から要素を挿入する 平均ケース O(N) N std:: distance ( i, j ) )、最悪ケース O(N 2 )
X ( std:: from_range ,
rg, n, hf, eq )

(C++23以降)
value_type EmplaceConstructible であり、 X * ranges:: begin ( rg ) から構築可能であること 少なくとも n 個のバケットを持つ空のコンテナを構築し、 hf をハッシュ関数、 eq をキー等価述語として使用し、 rg から要素を挿入する 平均ケース O(N) ( N ranges:: distance ( rg ) )、最悪ケース O(N 2 )
X ( std:: from_range ,
rg, n, hf )

(C++23以降)
key_equal DefaultConstructible である。 value_type EmplaceConstructible であり、 X * ranges:: begin ( rg ) から構築可能である 少なくとも n 個のバケットを持ち、 hf をハッシュ関数、 key_equal ( ) をキー等価述語として使用し、 rg から要素を挿入して空のコンテナを構築する 平均ケース O(N) ( N ranges:: distance ( rg ) )、最悪ケース O(N 2 )
X ( std:: from_range ,
rg, n )

(C++23以降)
hasher key_equal DefaultConstructible である。 value_type EmplaceConstructible であり、 X * ranges:: begin ( rg ) から構築可能である 少なくとも n 個のバケットを持つ空のコンテナを構築し、 hasher ( ) をハッシュ関数、 key_equal ( ) をキー等値述語として使用し、 rg から要素を挿入する 平均ケース O(N) N ranges:: distance ( rg ) )、最悪ケース O(N 2 )
X ( std:: from_range ,
rg )

(C++23以降)
hasher key_equal DefaultConstructible である。 value_type EmplaceConstructible であり、 X * ranges:: begin ( rg ) から構築可能である 未指定のバケット数を持つ空のコンテナを構築し、 hasher ( ) をハッシュ関数、 key_equal ( ) をキー等値述語として使用し、 rg から要素を挿入する 平均ケース O(N) ( N ranges:: distance ( rg ) )、最悪ケース O(N 2 )
X ( il ) X ( il. begin ( ) , il. end ( ) )
X ( il, n ) X ( il. begin ( ) , il. end ( ) , n )
X ( il, n, hf ) X ( il. begin ( ) , il. end ( ) , n, hf )
X ( il, n, hf, eq ) X ( il. begin ( ) , il. end ( ) , n, hf, eq )
X ( b ) Container ; ハッシュ関数、述語、最大負荷係数をコピーする 平均ケースでは b. size ( ) に対して線形、最悪ケースでは O(N 2 )
a = b X& Container ; ハッシュ関数、述語、最大負荷係数をコピーする 平均ケースでは b. size ( ) に対して線形、最悪ケースでは O(N 2 )
a = il X& value_type CopyInsertable であり X に挿入可能かつ CopyAssignable であること 範囲 [ il. begin ( ) , il. end ( ) ) a に代入する。 a の既存の要素はすべて代入されるか破棄される 平均ケースでは il. size ( ) に比例し、最悪ケースでは O(N 2 )
b. hash_function ( ) hasher b のハッシュ関数 定数
b. key_eq ( ) key_equal b のキー等価述語 定数
a_uniq. emplace ( args ) std:: pair <
iterator,
bool >
value_type EmplaceConstructible であること X から args value_type オブジェクト t std:: forward < Args > ( args ) ... で構築し、コンテナ内に t のキーと等価なキーを持つ要素が存在しない場合にのみ挿入する 返されるpairの bool コンポーネントは、挿入が行われた場合にのみ true となり、イテレータコンポーネントは t のキーと等価なキーを持つ要素を指す 平均ケース O(1) 、最悪ケース O ( a_uniq. size ( ) )
a_eq. emplace ( args ) iterator value_type EmplaceConstructible であり、 X args から構築可能であること std:: forward < Args > ( args ) ... で構築された value_type オブジェクト t を挿入する 新しく挿入された要素を指すイテレータ 平均ケース O(1) 、最悪ケース O ( a_eq. size ( ) )
a. emplace_hint ( p, args ) iterator value_type EmplaceConstructible であり、 X args から構築可能であること a. emplace (
std:: forward < Args > ( args ) ... )
新しく挿入された要素と等価なキーを持つ要素を指すイテレータ。 const_iterator p は検索を開始すべき位置を示すヒントである。実装はこのヒントを無視することが許可されている 平均ケース O(1) 、最悪ケース O ( a. size ( ) )
a_uniq. insert ( t ) std:: pair <
iterator,
bool >
t が非const右辺値の場合、 value_type MoveInsertable でなければならない。それ以外の場合、 value_type CopyInsertable でなければならない。 t のキーと等価なキーを持つ要素がコンテナ内に存在しない場合にのみ t を挿入する 返されるpairの bool コンポーネントは挿入が行われたかどうかを示し、 iterator コンポーネントは t のキーと等価なキーを持つ要素を指す 平均ケース O(1) 、最悪ケース O ( a_uniq. size ( ) )
a_eq. insert ( t ) iterator t が非const右辺値の場合、 value_type MoveInsertable でなければならない。それ以外の場合、 value_type CopyInsertable でなければならない。 t を挿入する 新しく挿入された要素を指すイテレータ 平均ケース O(1) 、最悪ケース O ( a_eq. size ( ) )
a. insert ( p, t ) iterator t が非const右辺値の場合、 value_type MoveInsertable でなければならない。それ以外の場合、 value_type CopyInsertable でなければならない a. insert ( t ) と同等。イテレータ p は検索を開始すべき位置を示すヒントである。実装はこのヒントを無視することが許されている t のキーと等価なキーを持つ要素を指すイテレータ 平均ケース O(1) 、最悪ケース O ( a. size ( ) )
a. insert ( i, j ) void value_type EmplaceConstructible であり、 X に対して * i から構築可能である。 i および j a に対するイテレータではない a. insert ( t )
[ i , j ) の各要素に対して実行
平均ケース O(N) 、ここで N std:: distance ( i, j ) 、最悪ケース O ( ( a. size ( ) + 1 ) )
a. insert_range ( rg )
(C++23以降)
void value_type EmplaceConstructible であり、 X * ranges:: begin ( rg ) から構築可能であること。 rg a は重複していないこと a. insert ( t ) rg 内の各要素 t に対して実行 平均ケース O(N) 、ここで N ranges:: distance ( rg ) 、最悪ケース O ( ( a. size ( ) + 1 ) )
a. insert ( il ) a. insert ( il. begin ( ) , il. end ( ) )
a_uniq. insert ( nh )
(C++17以降)
insert_return_type nh が空であるか、

a_uniq. get_allocator ( )
==
nh. get_allocator ( )
true であること

nh が空の場合、何も行わない。それ以外の場合、 nh が所有する要素を、コンテナ内に nh. key ( ) と等価なキーを持つ要素が存在しない場合にのみ挿入する。保証事項: nh が空の場合、 inserted false position end ( ) node は空となる。それ以外で挿入が行われた場合、 inserted true position は挿入された要素を指し、 node は空となる。挿入が失敗した場合、 inserted false node nh の前の値を持ち、 position nh. key ( ) と等価なキーを持つ要素を指す 平均ケース O(1) 、最悪ケース O ( a_uniq. size ( ) )
a_eq. insert ( nh )
(C++17以降)
iterator nh が空であるか、

a_eq. get_allocator ( )
==
nh. get_allocator ( )
true であること

nh が空の場合、効果はなく a_eq. end ( ) を返す。それ以外の場合、 nh が所有する要素を挿入し、新しく挿入された要素を指すイテレータを返す。以下のことを保証する: nh は空になる 平均ケース O(1) 、最悪ケース O ( a_eq. size ( ) )
a. insert ( q, nh )
(C++17以降)
iterator nh が空であるか、

a. get_allocator ( )
==
nh. get_allocator ( )
true であること

nh が空の場合、何も効果がなく a. end ( ) を返す。それ以外の場合、一意キーを持つコンテナでは nh. key ( ) と等価なキーを持つ要素が存在しない場合にのみ、 nh が所有する要素を挿入する。等価キーを持つコンテナでは常に nh が所有する要素を挿入する。イテレータ q は検索を開始すべき位置を示すヒントである。実装はこのヒントを無視することが許可されている。挿入が成功した場合は nh が空になり、失敗した場合は変更されないことを保証する。 nh. key ( ) と等価なキーを持つ要素を指すイテレータ 平均ケース O(1) 、最悪ケース O ( a. size ( ) )
a. extract ( k )
(C++17以降)
node_type キーが k と等しい要素をコンテナから削除する 要素が見つかった場合はその要素を所有する node_type 、それ以外の場合は空の node_type 平均ケース O(1) 、最悪ケース O ( a. size ( ) )
a_tran. extract ( kx )
(C++23以降)
node_type キーが kx と等価な要素をコンテナから削除する 見つかった場合は要素を所有する node_type 、それ以外の場合は空の node_type 平均ケース O(1) 、最悪ケース O ( a_tran. size ( ) )
a. extract ( q )
(C++17以降)
node_type q が指す要素を削除 その要素を所有する node_type 平均ケース O(1) 、最悪ケース O ( a. size ( ) )
a. merge ( a2 )
(C++17以降)
void a. get_allocator ( )
==
a2. get_allocator ( )
a2 の各要素を抽出して a のハッシュ関数とキー等価述語を使用して a に挿入しようと試みる。ユニークキーを持つコンテナでは、 a a2 からの要素のキーと等価なキーを持つ要素が既に存在する場合、その要素は a2 から抽出されない。保証事項: a2 の転送された要素へのポインタと参照は、同じ要素を参照するが a のメンバとして参照する。転送された要素を参照するイテレータと a を参照する全てのイテレータは無効化されるが、 a2 に残る要素へのイテレータは有効なままである 平均ケース O(N) 、ここで N a2. size ( ) 、最悪ケース O ( ( a. size ( ) + 1 ) )
a. erase ( k ) size_type キー k と等価な全ての要素を削除 削除された要素の数 平均ケース O ( a. count ( k ) )、最悪ケース O ( a. size ( ) )
a_tran. erase ( kx )
(C++23以降)
size_type kxと等価なキーを持つ全ての要素を削除する 削除された要素の数 平均ケース O ( a_tran. count ( kx ) )、最悪ケース O ( a_tran. size ( ) )
a. erase ( q ) iterator qが指す要素を削除する 削除前のqの直後のイテレータ 平均ケース O(1) 、最悪ケース O ( a. size ( ) )
a. erase ( r )
(C++17以降)
iterator r が指す要素を削除 削除前の r の直後のイテレータ 平均ケース O(1) 、最悪ケース O ( a. size ( ) )
a. erase ( q1, q2 ) iterator 範囲
[ q1 , q2 ) 内のすべての要素を削除
削除前の削除された要素の直後のイテレータ 平均計算量: std:: distance ( q1, q2 ) 、最悪計算量: O ( a. size ( ) )
a. clear ( ) void コンテナ内のすべての要素を削除します。以下の条件を保証します: a. empty ( ) true になること a. size ( ) に対して線形時間
b. find ( k ) iterator ; const_iterator 定数オブジェクト用 b キー k と等価な要素を指すイテレータ、またはそのような要素が存在しない場合は b. end ( ) を返す 平均ケース O(1) 、最悪ケース O ( b. size ( ) )
a_tran. find ( ke )
(C++17以降) ?
iterator ; const_iterator 定数オブジェクト用 a_tran ke と等価なキーを持つ要素を指すイテレータ、またはそのような要素が存在しない場合は a_tran. end ( ) を返す 平均ケース O(1) 、最悪ケース O ( a_tran. size ( ) )
b. count ( k ) size_type キーが k と等しい要素の数 平均ケース O ( b. count ( k ) )、最悪ケース O ( b. size ( ) )
a_tran. count ( ke )
(C++17以降) ?
size_type キー ke と等価な要素の数 平均ケース O ( a_tran. count ( ke ) )、最悪ケース O ( a_tran. size ( ) )
b. contains ( k )
(C++20以降) ?
b. find ( k ) ! = b. end ( )
a_tran. contains ( ke )
(C++20以降) ?
a_tran. find ( ke ) ! = a_tran. end ( )
b. equal_range ( k ) std:: pair <
iterator,
iterator > ;

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

キー k と等価なすべての要素を含む範囲。該当する要素が存在しない場合は

std:: make_pair (
b. end ( ) , b. end ( ) )
を返す

平均ケース O ( b. count ( k ) )、最悪ケース O ( b. size ( ) )
a_tran. equal_range ( ke )
(C++20以降) ?
std:: pair <
iterator,
iterator > ;

std:: pair <
const_iterator,
const_iterator > const版の場合 a_tran

ke と等価なキーを持つ全ての要素を含む範囲。該当する要素が存在しない場合は

std:: make_pair (
a_tran. end ( ) ,
a_tran. end ( ) )
を返す

平均ケース O ( a_tran. count ( ke ) )、最悪ケース O ( a_tran. size ( ) )
b. bucket_count ( ) size_type b が含むバケットの数 定数時間
b. max_bucket_count ( ) size_type bが含むことのできるバケット数の上限 定数
b. bucket ( k ) size_type b. bucket_count ( ) > 0 キーkと等価なキーを持つ要素が存在する場合に、その要素が格納されるバケットのインデックス。戻り値は [ 0 , b. bucket_count ( ) ) の範囲内 定数時間
a_tran. bucket ( ke ) size_type a_tran.
bucket_count ( ) > 0
キーが ke と等価な要素が存在する場合に、その要素が見つかるバケットのインデックス。戻り値は範囲 [ 0 , a_tran. bucket_count ( ) ) 内でなければならない 定数時間
b. bucket_size ( n ) size_type n [ 0 , b. bucket_count ( ) ) の範囲内にある場合 n バケット内の要素数 O ( b. bucket_size ( n ) )
b. begin ( n ) local_iterator ; const_local_iterator 定数用 n [ 0 , b. bucket_count ( ) ) の範囲内にあること バケット内の最初の要素を指すイテレータ。バケットが空の場合、 b. begin ( n ) == b. end ( n ) 定数時間
b. end ( n ) local_iterator ; const_local_iterator 定数用 b n [ 0 , b. bucket_count ( ) ) の範囲内 バケットの終端値を示すイテレータ 定数時間
b. cbegin ( n ) const_local_iterator n [ 0 , b. bucket_count ( ) ) の範囲内 バケット内の最初の要素を指すイテレータ。バケットが空の場合、 b. cbegin ( n ) == b. cend ( n ) となる 定数時間
b. cend ( n ) const_local_iterator n [ 0 , b. bucket_count ( ) ) の範囲内 バケットの末尾を指すイテレータ 定数
b. load_factor ( ) float バケットあたりの平均要素数 定数時間
b. max_load_factor ( ) float コンテナが負荷係数をこれ以下に保とうとする正の数。コンテナは必要に応じてバケット数を自動的に増加させ、負荷係数がこの値を下回るように維持する 定数
a. max_load_factor ( z ) void z は正の値。コンテナの最大負荷率を変更する可能性があり、 z をヒントとして使用 定数時間
a. rehash ( n ) void 保証:

a. bucket_count ( ) >=
a. size ( ) / a. max_load_factor ( )
かつ a. bucket_count ( ) >= n

平均ケースでは a. size ( ) に対して線形時間、最悪ケースでは O(N 2 )
a. reserve ( n ) a. rehash ( std:: ceil (
n / a. max_load_factor ( ) ) )

標準ライブラリ

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

一意のキーのコレクション、キーでハッシュ化
(クラステンプレート)
キーのコレクション、キーでハッシュ化
(クラステンプレート)
キーと値のペアのコレクション、キーでハッシュ化、キーは一意
(クラステンプレート)
キーと値のペアのコレクション、キーでハッシュ化
(クラステンプレート)

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 2156 C++11 再ハッシュ後の負荷係数は最大負荷係数より
厳密に低い場合のみ可能
等しいことも許可