私はC ++に比較的慣れていません。Java では、ハッシュマップをインスタンス化して使用するのは簡単です。多くの異なる実装を見て、どれも単純に見えなかったので、C++ で簡単な方法でそれを行う方法を知りたいです。
5 に答える
ほとんどのコンパイラは、定義する必要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++マップを使用するようなものです。のコンパイラ/ライブラリ実装を使用するか、 boostまたは他のベンダーunordered_map
が提供するものを使用できます。これが簡単なサンプルです。与えられたリンクをたどると、もっと見つけることができます。
#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とそのデータ構造を見てください。
ブーストの順序付けられていないクラスを試してください。
ジェネリック型のキーと値のペアと個別の連鎖戦略を使用した基本的なハッシュ テーブルについては、C++ での単純なハッシュ マップ (ハッシュ テーブル) の実装を確認してください。