void rehash(size_type n);
概要
コンテナのバケット数が最小でも引数 n
で指定された値になるように調整(リハッシュ)する。
事後条件
bucket_count() > size() / max_load_factor()
かつ、bucket_count() >= n
。
戻り値
なし
例外
ハッシュ関数、および、キー比較用関数以外から例外が投げられた場合、コンテナは変更されない。
計算量
平均的なケースでは size()
に比例するが、最悪のケースでは size()
の 2 乗に比例する。
備考
- リハッシュが行われた場合、
- 全てのイテレータが無効になる。
- 要素間の順番が変わる。
- 要素の格納されているバケットが変更になる。
- 要素へのポインタや参照は無効にならない。
- 現在のバケット数が
n
以上の場合の動作は、標準では特に規定されていない。 - 標準では、事後条件が
bucket_count() > size() / max_load_factor()
となっている(等号がない)が、load_factor()
(= size() / bucket_count()
)の条件はmax_load_factor() >= load_factor()
である(等号がある)ため、bucket_count() >= size() / max_load_factor()
の(等号がある)方が適切であると思われる。
例
#include <iostream> #include <unordered_set> int main() { std::unordered_multiset<int> ums{ 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, }; std::cout << "size is " << ums.size() << ", max_load_factor is " << ums.max_load_factor() << std::endl; std::cout << "bucket_count is " << ums.bucket_count() << std::endl; // 現在のバケット数より大きな値を指定する。 ums.rehash(100); std::cout << "bucket_count is " << ums.bucket_count() << std::endl; // 現在の要素数 / max_load_factor() よりは大きく、現在のバケット数よりは小さい値を指定する。 ums.rehash(20); std::cout << "bucket_count is " << ums.bucket_count() << std::endl; // 現在の要素数 / max_load_factor() より小さい値を指定する。 ums.rehash(1); std::cout << "bucket_count is " << ums.bucket_count() << std::endl; }
出力例
size is 12, max_load_factor is 1
bucket_count is 23
bucket_count is 101
bucket_count is 23
bucket_count is 13
バージョン
言語
- C++11
処理系
- Clang: -
- Clang, C++11 mode: 3.1
- GCC: -
- GCC, C++11 mode: 4.7.0
- ICC: ?
- Visual C++: ?
関連項目
名前 | 説明 |
---|---|
size |
要素数の取得 |
bucket_count |
バケット数の取得 |
load_factor |
現在の負荷率(バケットあたりの要素数の平均)を取得 |
max_load_factor |
負荷率の最大値を取得、設定 |
reserve |
最小要素数指定によるバケット数の調整 |