2016-10-11 5 views
0

C++で順序付けされていないマップを使用してハッシュマップを実装する方法。 順序付けられていないマップのキーが、ハッシュ関数によって生成されたインデックスに対応する場合は、 は、複数の値が同じキーを持つ場合(衝突)はどうなりますか?次に、同じキーを使用してこれらの値にアクセスする方法を説明します。C++でunordered_mapを使用して衝突を処理するハッシュテーブルの実装

例えば

unordered_map <int,string> hashTable; 

hashTable.insert(pair<int,string>(3,"ab")) 
hashTable.insert(pair<int,string>(3,"ba")) 

今すぐアクセス "BA" を行う方法? @amchaconが指摘したように

+6

Unordered_mapは実際にはハッシュテーブルです。 – amchacon

+4

より良い例を使用したい場合があります。同じキーを持つので、2番目の挿入は失敗します。 – NathanOliver

+0

unordered_mapのキーは一意でなければならず、unordered_mapのキーであればハッシュキーであるため、疑問が@amchaconです。 –

答えて

4

は、STD :: unordered_mapはすでにハッシュテーブルです。

キーとハッシュ(キー)に違いがあります。 unordered_mapでは、キーが区別されていなければなりませんが、キーのハッシュは衝突する可能性があります。 std::unordered_mapのテンプレートパラメータを詳しく見てください。ハッシュがあり、KeyEqualがあります。

あなたは確かに、同じキーで複数のレコードを持っている代わりにstd::unordered_multimapを使用したい場合

+0

したがって、unordered_mapの値は、実際に実装されているハッシュテーブルのキーとして使用され、unordered_mapのキーは実際に保存したいものですか? –

+0

データが実際に(キー、値)のペアであるかどうかを調べる必要があります。例えば。 (int employee_id、string employee_info)を持っている場合は、unordered_map に格納することができます。通常、「ハッシュテーブルのキー」について心配する必要はありません。デフォルトでstd :: unordered_mapはstd :: hash を使用します。一方、値の集合を持つことができます。この場合、代わりにstd :: setを使用することができます。それで、あなたの質問に対する答えはノーです。 unordered_mapの値はハッシュテーブルのキーとして使用されません。 std :: hash です。 –

0

hashTable[3]は、実際に "BA" です。

のように検索することができます。

auto it = hashTable.find(3); 
if(it!=hashTable.end()){ 
    std::cout << "item found" << it->second << "\n"; 
}else{ 
    std::cout << "item does not exists in table."; 
} 
関連する問題