最終更新日時:
が更新

履歴 編集

function
<unordered_set>

std::unordered_multiset::rehash(C++11)

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

処理系

参照

size 要素数の取得
bucket_count バケット数の取得
load_factor 現在の負荷率(バケットあたりの要素数の平均)を取得
max_load_factor 負荷率の最大値を取得、設定
reserve 最小要素数指定によるバケット数の調整