float max_load_factor() const noexcept; // (1) C++11
constexpr float max_load_factor() const noexcept; // (1) C++26
void max_load_factor(float z); // (2) C++11
constexpr void max_load_factor(float z); // (2) C++26
概要
- (1) : 負荷率(バケットあたりの要素数の平均)の最大値を取得する。
- (2) : 負荷率(バケットあたりの要素数の平均)の最大値を設定する。
要件
z は正の数であること。
効果
- (1) : なし。
- (2) : 引数
z を「ヒント」として、負荷率(バケットあたりの要素数の平均)の最大値を変更する「かもしれない」。
戻り値
- (1) : 負荷率(バケットあたりの要素数の平均)の最大値
- (2) : なし
例外
投げない。
計算量
定数。
備考
例
#include <iostream>
#include <unordered_set>
template<class C>
void print(const C& c)
{
std::cout << "size is " << c.size() <<
", bucket_count is " << c.bucket_count() <<
", load_factor is " << c.load_factor() <<
", bucket_count * max_load_factor is " << static_cast<float>(c.bucket_count()) * c.max_load_factor() << '\n' << std::endl;
}
int main()
{
std::unordered_set<int> us(12);
std::cout << "max_load_factor is " << us.max_load_factor() << "\n\n"; // (1) の形式。max_load_factor のデフォルトは 1.0f。
print(us);
us.max_load_factor(2.0f); // (2) の形式。max_load_factor を 2.0f に設定。
float z = us.max_load_factor(); // (1) の形式。上記で設定した値。
std::cout << "max_load_factor is " << z << "\n\n";
print(us);
decltype(us)::size_type b = us.bucket_count();
float limit = static_cast<float>(b) * z;
// max_load_factor を超えるちょっと前まで要素を追加。
decltype(us)::size_type i = 1;
for (; i < limit; ++i) {
us.emplace(i);
}
// max_load_factor を超えて bucket_count が変わるまで、状態を出力しつつ要素を追加。
for (; us.bucket_count() == b; ++i) {
print(us);
us.emplace(i);
}
// bucket_count が変わった直後の状態を出力。
print(us);
us.max_load_factor(us.load_factor() / 2.0f); // (2) の形式。max_load_factor を現在の値の 1/2 を引数にして呼び出し。
z = us.max_load_factor(); // (1) の形式。上記で設定した値。
std::cout << "max_load_factor is " << z << "\n\n";
// 最終的な状態を出力。
print(us);
}
出力例
libstdc++ の出力例(4.7.2 時点)
max_load_factor is 1
size is 0, bucket_count is 29, load_factor is 0, bucket_count * max_load_factor is 29
max_load_factor is 2
size is 0, bucket_count is 2, load_factor is 0, bucket_count * max_load_factor is 4
size is 3, bucket_count is 2, load_factor is 1.5, bucket_count * max_load_factor is 4
size is 4, bucket_count is 7, load_factor is 0.571429, bucket_count * max_load_factor is 14
max_load_factor is 0.285714
size is 4, bucket_count is 29, load_factor is 0.137931, bucket_count * max_load_factor is 8.28572
libc++ の出力例(2012/12/19 現在)
max_load_factor is 1
size is 0, bucket_count is 13, load_factor is 0, bucket_count * max_load_factor is 13
max_load_factor is 2
size is 0, bucket_count is 13, load_factor is 0, bucket_count * max_load_factor is 26
size is 25, bucket_count is 13, load_factor is 1.92308, bucket_count * max_load_factor is 26
size is 26, bucket_count is 13, load_factor is 2, bucket_count * max_load_factor is 26
size is 27, bucket_count is 29, load_factor is 0.931035, bucket_count * max_load_factor is 58
max_load_factor is 0.931035
size is 27, bucket_count is 29, load_factor is 0.931035, bucket_count * max_load_factor is 27
バージョン
言語
処理系
関連項目
参照