私は比較的C++に不慣れです。 Javaでは、ハッシュマップをインスタンス化して使用するのは簡単です。 C++で簡単な方法でそれを行う方法を知りたいです。なぜなら、私は多くの異なる実装を見たが、どれも私には単純に見えなかったからです。
ほとんどのコンパイラは、std::hash_map
を定義する必要があります。今後のC++0x
標準では、 std::unordered_map
として標準ライブラリの一部になります。 STLページ はかなり標準です。 Visual Studioを使用している場合、 Microsoft にはページがあります。
キーとしてではなく、値としてクラスを使用する場合は、特別なことをする必要はありません。すべてのプリミティブ型(int
、char
、bool
、さらには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;
その後、すべてが期待どおりに動作するはずです。
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;
}
boost.unordered とその data structure を見てください。
Boostの nordered クラスを試してください。
C++での単純なハッシュマップ(ハッシュテーブル)の実装 を確認してください。一般的なタイプのキーと値のペアと個別のチェーン戦略を備えた基本的なハッシュテーブルです。