C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++ STLのunordered_multimap::rehash()関数の使い方を徹底解説

C++ STLのunordered_multimap(およびunordered_map)が提供するrehash(N)関数は、コンテナ内のバケット数を引数n以上に設定するためのメンバ関数です。引数nが現在のバケット数よりも大きい場合、再ハッシュ(rehash)が強制的に実行され、新しいバケット数はnと等しいか、それ以上の値になります。

一方、引数nが現在のバケット数以下である場合は、バケット数に変化が生じず、再ハッシュも強制されません。つまり、この関数は「最低でもn個のバケットを確保する」という指示であり、戻り値は返しません。

構文

void rehash(size_type n);

パラメータ

  • n: コンテナのハッシュテーブルに確保するバケット数の最小値を指定します。

動作のポイント

  • nが現在のバケット数より大きい → バケット数が増やされ、全要素が再配置される(再ハッシュ発生)。
  • nが現在のバケット数以下 → 何も起こらない可能性がある。
  • 計算量は平均O(n)、最悪ケースでは要素数に比例する。

アルゴリズム

Begin
    空のマップコンテナmを宣言する。
    rehash()関数を呼び出し、コンテナのバケット数の下限を設定する。
    バケット数と同等以上のキーと値のペアをコンテナに挿入する。
    マップコンテナの要素を出力する。
End.

サンプルコード

#include<iostream>
#include <bits/stdc++.h>
using namespace std;

int main() {
   unordered_map<char, int> m;

   // バケット数の最小値を1に設定
   m.rehash(1);
   m.insert(pair<char, int>('b', 10));
   m.insert(pair<char, int>('a', 20));

   cout << "サイズ: " << m.size();
   cout << "\nキーと値: ";
   for (auto it = m.begin(); it != m.end(); it++) {
      cout << "{" << it->first << ", " << it->second << "} ";
   }
   return 0;
}

実行結果

サイズ: 2
キーと値: {a, 20} {b, 10}

コードの解説

まず空のunordered_mapコンテナmを宣言し、m.rehash(1)によってバケット数の最小値を1に設定しています。その後、2つのキーと値のペアを挿入すると、必要に応じてコンテナ側で自動的にバケットが拡張されます。最後に、範囲ベースのループでイテレータを使い、格納されたすべてのキーと値のペアを出力しています。

補足:関連する便利な関数

  • bucket_count(): 現在のバケット数を取得できます。
  • load_factor(): 要素数をバケット数で割った負荷率を確認できます。
  • max_load_factor(): 再ハッシュが発生する負荷率の上限を設定・取得できます。

大量のデータを挿入することが事前に分かっている場合は、rehash()reserve()を活用することで、挿入時の不要な再ハッシュを減らし、パフォーマンスを向上させることができます。

  1. C++ STLのcosh()関数とは?双曲線余弦の求め方をサンプルコード付きで解説

    cosh()関数とは? C++のSTLに組み込まれているcosh()関数は、ラジアン単位で与えられた角度の双曲線余弦(ハイパボリック・コサイン)を計算して返す関数です。使用するには、<cmath>ヘッダーをインクルードする必要があります。 双曲線余弦は、数学的に次の式で定義されます。 cosh(x) = (e^x + e^(-x)) / 2 構文 cosh()関数の構文は以下の通りです。 cosh(var) 構文から分かるように、cosh()関数はfloat型、double型、long double型のいずれかの引数varを受け取ります。そして、その双曲線余弦を返します。なお、引

  2. C++ STLのsinh()関数の使い方を徹底解説

    sinh()関数とはsinh()関数は、ラジアンで指定された値の双曲線正弦(ハイパボリックサイン)を返す関数です。C++のSTL(標準テンプレートライブラリ)に組み込まれており、<cmath>ヘッダをインクルードすることで利用できます。双曲線正弦は、以下の数式で定義されます。sinh(x) = (e^x − e^−x) / 2sinh()関数の構文sinh()関数の構文は以下のとおりです。sinh(var)構文からわかるように、sinh()関数はfloat型、double型、long double型のいずれかのパラメータvarを受け取ります。戻り値は、varの双曲線正弦です。sin