2016-12-12 2 views
1

unordered mapを作成して、n次元のポイントを含むようにしようとしています( スペース)。 std::vectorstd::mapのキーとなるためのすべての要件を満たしていますが、このコードはコンパイルされないことを理解しています。私は、エラーメッセージの長いリストを取得するが、これは最も問題のようだ:C++でstd :: unordered_mapのキーの型としてstd :: vectorを使用する方法は?

error: no match for call to ‘(const std::hash<std::vector<int> >) (const std::vector<int>&)'.

誰でもグラムの++はstd::vector<int>がハッシュ可能であることを考えるようには思えない理由についてどのような考えを持っていますか?

#include <vector> 
#include <unordered_map> 
#include <boost/functional/hash.hpp> 

using namespace std; 

typedef vector<int> point; 

int main() 
{ 
    unordered_map<point, int>jugSpace; 
    vector<int> origin(3, 0); 

    jugSpace.insert(pair<point,int>(origin, 0)); 
} 
+0

私はキーをベクトルへのポインタにします... – user2717954

+2

@ user2717954、恐ろしいアイデア。 – SergeyA

+1

カスタムクラスタイプをキーとして[C++ unordered \ _map]を複製する可能性があります(http://stackoverflow.com/questions/17016175/c-unordered-map-using-a-custom-class-type-as-the -key) –

答えて

2

無秩序マップには、キーのハッシュ関数が必要です。このような機能は、標準実装のstd::vectorでは存在しません。

std::mapを使用することもできますが、ベクトルには比較演算子が必要です。

実際にベクトルをハッシュマップのキーとして使用する必要がある場合(疑わしい)、ハッシュ関数を自分で実装する必要があります。

+0

http://en.cppreference.com/w/cpp/container/vector/operator_cmpだから、 'std :: map'で使うことができます。 – Jarod42

+0

@ Jarod42、うわー!決してこれを知らなかった!編集します。 – SergeyA

4

あなたが好きなあなたのポイントのためのテンプレートクラスstd::hash<>を特化する必要があります。

namespace std { 
    template<> 
    class hash<point> { 
    public: 
    size_t operator()(const point &p) const { 
     // put here your hash calculation code 
    } 
    }; 
} 

またはカスタム調理人のクラスを作成し、std::unordered_mapのテンプレート一員としてのタイプを指定します。

class my_hash { 
public: 
    size_t operator()(const point &p) const { 
    // your hash calculation code 
    } 
}; 

// somewhere in your code, where you declare your unordered_map variable 
std::unordered_map<point, int, my_hash> myUnorderedMap; 

使用したい場合boost::hash_valueをハッシュ関数として返し、その結果をハッシャー実装に返します。例:

class my_hash { 
public: 
    size_t operator()(const point &p) const { 
    return boost::hash_value(p); 
    } 
}; 
+0

私はベクトルのためにハッシュ関数を必要とする最初の人になることはできませんか?私はドキュメントを実際に理解していませんが、boostというのは、すでにhttp://www.boost.org/doc/libs/1_62_0/doc/html/hash/reference.htmlにあるハッシュを定義しているようです。 –

+0

@MontyEvans、私はハッシュ関数のいずれかから 'boost :: hash_value(p);'の値を返すことができると思います –

+0

ああ、大丈夫です。 hash関数を書いて、boostで与えられた値を返します。 –

関連する問題