size_type bucket(const key_type& k) const; // (1) C++11
template <class K>
size_type bucket(const K& k) const; // (2) C++26
概要
指定したキーと等価な要素が格納されている場合、そのバケットのインデックス(添え字)を取得する。
- (1) :
key_type
型のキーを受け取って、バケットのインデックスを取得する - (2) :
key_type
と比較可能なキーを受け取って、バケットのインデックスを取得する
テンプレートパラメータ制約
- (2) :
key_compare::is_transparent
が妥当な式であること
事前条件
当該コンテナは bucket_count() > 0
であること
戻り値
パラメータ k
と等価なキーの要素が格納されているバケットのインデックス(添え字)
事後条件
戻り値は [0, bucket_count())
の範囲である。
計算量
定数。
備考
- 指定したキーと等価な要素が格納されていない場合、そのキーを挿入した際に
rehash
が発生しなければ格納されるバケットのインデックス(添え字)が返る。 - (2) :
is_transparent
は、標準ライブラリのstd::less
、std::greater
といった関数オブジェクトの、void
に対する特殊化で定義される。それ以外のテンプレートパラメータでis_transparent
が定義されないのは、互換性のためである。- これらのオーバーロードは、
map<string, int>
のようなコンテナに対し、検索操作で文字列リテラルを渡した際に、キー型の一時オブジェクトが生成されるコストを減らすためにある。
例
#include <iostream>
#include <string>
#include <unordered_set>
int main()
{
std::unordered_multiset<std::string> ums{ "A", "B", "C", "D", "E", "A", "B", "C", "D", "E", };
decltype(ums)::size_type c = ums.bucket_count();
std::cout << "bucket_count() = " << c << std::endl;
// 全てのキーに対するバケットのインデックスとそのバケットの要素数を取得
for (decltype(ums)::key_type k : ums) {
decltype(ums)::size_type b = ums.bucket(k);
decltype(ums)::size_type s = ums.bucket_size(b);
std::cout << "key = " << k << ", bucket = " << b << ", bucket_size = " << s << std::endl;
}
// 存在しないキーに対するバケットのインデックスとそのバケットの要素数を取得
decltype(ums)::key_type k = "H";
decltype(ums)::size_type b = ums.bucket(k);
decltype(ums)::size_type s = ums.bucket_size(b);
std::cout << "key = " << k << ", bucket = " << b << ", bucket_size = " << s << std::endl;
}
出力
bucket_count() = 11
key = E, bucket = 6, bucket_size = 2
key = E, bucket = 6, bucket_size = 2
key = A, bucket = 5, bucket_size = 6
key = A, bucket = 5, bucket_size = 6
key = C, bucket = 5, bucket_size = 6
key = C, bucket = 5, bucket_size = 6
key = D, bucket = 5, bucket_size = 6
key = D, bucket = 5, bucket_size = 6
key = B, bucket = 7, bucket_size = 2
key = B, bucket = 7, bucket_size = 2
key = H, bucket = 3, bucket_size = 0
バージョン
言語
- C++11
処理系
- Clang: 3.1 ✅
- GCC: 4.7.2 ✅
- ICC: ?
- Visual C++: ?
関連項目
名前 | 説明 |
---|---|
max_bucket_count |
最大バケット数の取得 |
参照
- P2363R5 Extending associative containers with the remaining heterogeneous overloads
- C++26で
template <class K>
のバージョンが追加された
- C++26で