31

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

4

5 に答える 5

26

ほとんどのコンパイラは、定義する必要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;

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

于 2008-11-05T19:10:50.273 に答える
16

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;
}
于 2008-11-05T20:09:33.057 に答える
7

boost.unorderedとそのデータ構造を見てください。

于 2008-11-05T19:11:26.373 に答える
3

ブーストの順序付けられていないクラスを試してください。

于 2008-11-05T19:09:40.870 に答える
2

ジェネリック型のキーと値のペアと個別の連鎖戦略を使用した基本的なハッシュ テーブルについては、C++ での単純なハッシュ マップ (ハッシュ テーブル) の実装を確認してください。

于 2013-05-19T13:32:00.653 に答える