C++のunordered_mapの実装原理は何ですか?
unordered_mapはC++標準ライブラリの連想コンテナであり、キーと値のペアを格納するために使用されます。その実装原理はハッシュテーブルに基づいています。
ハッシュテーブルは、キーを配列のインデックスにマッピングして高速な検索を実現するデータ構造です。具体的な実装手順は以下の通りです:
- バケット配列を作成し、各バケットにはリンクリストが格納されています。
- キーと値のペアを挿入する際には、最初にハッシュ関数を使ってキーをインデックス値にマッピングし、その後、キーと値のペアを対応するバケツのリンクリストに挿入します。
- キーを検索する際は、まずハッシュ関数でキーに対応するインデックス値を計算し、その後対応するバケツのリンクリストで目標のキーを検索します。
- 冲突が発生した場合(異なる2つのキーが同じインデックスにマッピングされている場合)、リンクリストを使用して衝突を解決します。新しく挿入されたキーと値のペアはリンクリストの先頭に追加されるため、検索時に最新のキーと値のペアが最初に見つかります。
- 桶配列の負荷係数がある閾値(たとえば0.75)を超えた場合、拡張操作がトリガーされます。拡張時には、より大きなバケツ配列が作成され、元のキー-値ペアが新しいバケツ配列に再挿入されます。
unordered_mapは、ハッシュテーブルを基にしており、高速な挿入、検索、削除操作を提供し、平均時間計算量はO(1)です。ただし、ハッシュの衝突があるため、最悪の場合、検索操作の時間計算量はO(n)になります。ここでnはunordered_map内の要素数です。