web-dev-qa-db-ja.com

C ++での単純なハッシュマップの実装

私は比較的C++に不慣れです。 Javaでは、ハッシュマップをインスタンス化して使用するのは簡単です。 C++で簡単な方法でそれを行う方法を知りたいです。なぜなら、私は多くの異なる実装を見たが、どれも私には単純に見えなかったからです。

30
Paulo Guedes

ほとんどのコンパイラは、std::hash_mapを定義する必要があります。今後のC++0x標準では、 std::unordered_map として標準ライブラリの一部になります。 STLページ はかなり標準です。 Visual Studioを使用している場合、 Microsoft にはページがあります。

キーとしてではなく、値としてクラスを使用する場合は、特別なことをする必要はありません。すべてのプリミティブ型(intcharbool、さらにはchar *など)は、hash_mapのキーとして「機能する」必要があります。ただし、それ以外の場合は、独自のハッシュ関数と等式関数を定義してから、それらをクラスにラップする「ファンクター」を記述する必要があります。

クラスがMyClassと呼ばれ、すでに定義されていると仮定します:

size_t MyClass::HashValue() const { /* something */ }
bool MyClass::Equals(const MyClass& other) const { /* something */ }

これらのメソッドをオブジェクトでラップするには、2つのファンクターを定義する必要があります。

struct MyClassHash {
  size_t operator()(const MyClass& p) const {
    return p.HashValue();
  }
};

struct MyClassEqual {
  bool operator()(const MyClass& c1, const MyClass& c2) const {
    return c1.Equals(c2);
  }
};

そして、hash_map/hash_setを次のようにインスタンス化します。

hash_map<MyClass, DataType, MyClassHash, MyClassEqual> my_hash_map;
hash_set<MyClass, MyClassHash, MyClassEqual> my_hash_set;

その後、すべてが期待どおりに動作するはずです。

26
hazzen

C++でハッシュマップを使用するのは簡単です!標準のC++マップを使用するようなものです。 unordered_mapのコンパイラ/ライブラリ実装を使用するか、 boost または他のベンダーが提供するものを使用できます。以下に簡単なサンプルを示します。あなたが与えられたリンクをたどれば、もっと見つけるでしょう。

#include <unordered_map>
#include <string>
#include <iostream>

int main()
{
    typedef std::tr1::unordered_map< std::string, int > hashmap;
    hashmap numbers;

    numbers["one"] = 1;
    numbers["two"] = 2;
    numbers["three"] = 3;

    std::tr1::hash< std::string > hashfunc = numbers.hash_function();
    for( hashmap::const_iterator i = numbers.begin(), e = numbers.end() ; i != e ; ++i ) {
        std::cout << i->first << " -> " << i->second << " (hash = " << hashfunc( i->first ) << ")" << std::endl;
    }
    return 0;
}
16
Kasprzol

boost.unordered とその data structure を見てください。

7
dalle

Boostの nordered クラスを試してください。

3
Mark Ransom

C++での単純なハッシュマップ(ハッシュテーブル)の実装 を確認してください。一般的なタイプのキーと値のペアと個別のチェーン戦略を備えた基本的なハッシュテーブルです。

2
aozturk