c++ - 用作 unordered_map 键的一对枚举值的自定义哈希函数

标签 c++ hash enums unordered-map

我正在尝试使用 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);
    }
};

但我在 VS 编译器上收到错误 C3840(具有“type”类型的表达式会丢失一些 const-volatile 限定符以调用“function”)。

谁能建议我声明与 unordered_map 一起使用的自定义哈希函数的正确方法?

最佳答案

您可以定义一个最后的枚举值,然后用它来生成散列(实际上是一个完美的散列)。请注意,这假设可能的枚举值的数量足够少,以至于(假设枚举值的数量为 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

关于c++ - 用作 unordered_map 键的一对枚举值的自定义哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11376163/

相关文章:

c++ - 如何禁用 getter 返回的临时写入?

java - HashMap 中可以避免重新哈希吗?

ruby-on-rails - ruby 中的破解如何访问转换为哈希的 JSON 中的数据?

c++ - C++ 中无序关联容器的哈希函数

java - 枚举的实现

c# - 如何将枚举作为参数传递?

c++ - 运算符重载问题

c++ - MFC中如何进行系统调用?

c++ - 迭代多个序列。 C++11 中的容器

python-3.x - 在没有类名的 Python 中获取枚举名