2

我正在尝试使用 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 回答