size_type bucket(const key_type& k) const; // (1) C++11
constexpr size_type bucket(const key_type& k) const; // (1) C++26
template <class K>
constexpr size_type bucket(const K& k) const; // (2) C++26
概要
指定したキーと等価な要素が格納されている場合、そのバケットのインデックス(添え字)を取得する。
- (1) :
key_type型のキーを受け取って、バケットのインデックスを取得する
- (2) :
key_typeと比較可能なキーを受け取って、バケットのインデックスを取得する
テンプレートパラメータ制約
- (2) :
Hash::is_transparentおよびPred::is_transparentが妥当な式であること
事前条件
当該コンテナは bucket_count() > 0 であること
戻り値
パラメータ k と等価なキーの要素が格納されているバケットのインデックス(添え字)
事後条件
戻り値は [0, bucket_count()) の範囲である。
計算量
定数。
備考
- 指定したキーと等価な要素が格納されていない場合、そのキーを挿入した際に
rehash が発生しなければ格納されるバケットのインデックス(添え字)が返る。
- (2) :
is_transparentは、HashとPredの両方がメンバ型として持つ必要がある。Predにはis_transparentを定義するstd::equal_to<>が使えるが、Hashには標準ライブラリに該当するものがないため、利用者が定義する必要がある。詳細はstd::hashクラスのページを参照。
- これらのオーバーロードは、
unordered_map<string, int>のようなコンテナに対し、検索操作で文字列リテラルを渡した際に、キー型の一時オブジェクトが生成されるコストを減らすためにある。
例
#include <iostream>
#include <unordered_map>
int main()
{
std::unordered_map<char, int> um = {
{'A', 1},
{'B', 2},
{'C', 3},
{'D', 4},
{'E', 5}
};
decltype(um)::size_type c = um.bucket_count();
std::cout << "bucket_count() = " << c << std::endl;
// 全てのキーに対するバケットのインデックスとそのバケットの要素数を取得
for (decltype(um)::const_reference x : um) {
decltype(um)::key_type k = x.first;
decltype(um)::size_type b = um.bucket(k);
decltype(um)::size_type s = um.bucket_size(b);
std::cout << "key = " << k << ", bucket = " << b << ", bucket_size = " << s << std::endl;
}
// 存在しないキーに対するバケットのインデックスとそのバケットの要素数を取得
decltype(um)::key_type k = 'H';
decltype(um)::size_type b = um.bucket(k);
decltype(um)::size_type s = um.bucket_size(b);
std::cout << "key = " << k << ", bucket = " << b << ", bucket_size = " << s << std::endl;
}
出力例
bucket_count() = 11
key = E, bucket = 3, bucket_size = 1
key = A, bucket = 10, bucket_size = 1
key = B, bucket = 0, bucket_size = 1
key = C, bucket = 1, bucket_size = 1
key = D, bucket = 2, bucket_size = 1
key = H, bucket = 6, bucket_size = 0
バージョン
言語
処理系
関連項目
参照