2

enum 値の std::pair を unordered_map コンテナーのキーとして使用しようとしていますが、カスタム ハッシュ関数を定義するのが困難です。

私は次のことを試しました:

//enum and pair declaration
enum ShapeType{PLANE, BOX, SPHERE};
typedef std::pair<ShapeType,ShapeType> ShapePair;

//unordered_map declaration
typedef void(*CollisionMethod)(const Shape*, const Shape*, CollisionData*);
typedef std::unordered_map<ShapePair, CollisionMethod,ShapePairHash> CollisionMethodsTable;

ShapePairHash ファンクターを正しく定義する方法がわかりません。私は次のことを試しました:

struct ShapePairHash
{
    std::size_t operator()(const ShapePair &pair)
    {
        return std::hash<std::size_t>()(pair.first) ^ std::hash<std::size_t>()(pair.second);
    }
};

expression having type 'type' would lose some const-volatile qualifiers in order to call 'function'しかし、VS コンパイラでエラー C3840 ( ) が発生します。

unordered_map で使用するカスタム ハッシュ関数を宣言する正しい方法を教えてくれる人はいますか?

4

2 に答える 2

3

最後の列挙値を定義し、それを使用してハッシュ (実際には完全なハッシュ) を生成できます。これは、可能な列挙値の数が十分に少ないことを前提としていることに注意してください (列挙値の数が N であると仮定します)。N * N + N < MAX_UINT

enum class ShapeType : unsigned int { PLANE=0, BOX=1, SPHERE=2, LAST=3 };

struct ShapePairHash
{
    std::size_t operator()(const ShapePair &pair) const
    {
      return static_cast<std::size_t>(pair.first)
           * static_cast<std::size_t>(ShapeType::LAST)
           + static_cast<std::size_t>(pair.second)
    }
};

また、コンパイルの問題については、関数constを宣言するだけです。

于 2012-07-07T15:20:58.983 に答える
3

あなたの operator() メソッドは const でなければなりません:

std::size_t operator()(const ShapePair &pair) const
于 2012-07-07T15:27:54.107 に答える