最終更新日時:
が更新

履歴 編集

function
<unordered_set>

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

void reserve(size_type n);

概要

コンテナが、リハッシュされずに少なくとも引数 n で指定された要素数格納できるようにバケット数を調整(リハッシュ)する。(ただし、備考を参照)

事後条件

bucket_count() > size() / max_load_factor() かつ、bucket_count() >= ceil(n / max_load_factor())

戻り値

なし

例外

ハッシュ関数、および、キー比較用関数以外から例外が投げられた場合、コンテナは変更されない。

計算量

平均的なケースでは size() に比例するが、最悪のケースでは size() の 2 乗に比例する。

備考

  • C++11 : リハッシュされずに引数 n で指定された要素数が格納できるように意図されているはずが、 n - 1 しか格納することができない場合がある(少なくとも、事後条件を満たすだけでは確実に n 要素を格納できる保証はない)。
  • C++17 : リハッシュされずに引数 n で指定された要素数以上が格納できるようになる。
  • リハッシュされる条件については、insert()emplace()emplace_hint() も参照。
  • リハッシュが行われた場合、
    • 全てのイテレータが無効になる。
    • 要素間の順番が変わる。
    • 要素の格納されているバケットが変更になる。
    • 要素へのポインタや参照は無効にならない
  • 現在のバケット数が既に ceil(n / 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.reserve(100);
  std::cout << "bucket_count is " << ums.bucket_count() << std::endl;

  // 現在の要素数よりは大きく、現在のバケット数 / max_load_factor() よりは小さい値を指定する。
  ums.reserve(20);
  std::cout << "bucket_count is " << ums.bucket_count() << std::endl;

  // 現在の要素数より小さい値を指定する。
  ums.reserve(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 負荷率の最大値を取得、設定
rehash 最小バケット数指定によるバケット数の調整
insert 要素の追加
emplace コンテナ内への要素の直接構築
emplace_hint 挿入位置のヒントを使用したコンテナ内への要素の直接構築