c++ - 如何声明一个哈希函数以用于命名空间内的 unordered_set?

标签 c++ hash

我已经成功地为自定义类创建了一个散列函数(和 == 覆盖),因此我可以在 unordered_set 中使用它。但是,理想情况下,我想在要使用的类附近为我的类定义模板特化。这可以通过以下方式完成,效果很好:

class MyClass {
public:
    MyClass() { _id = _nextId++; }
    const int id() const { return _id; }
private:
    int _id;
    static int _nextId;
};

int MyClass::_nextId = 0;

template<>
struct std::hash<MyClass> {
    std::size_t operator()(const MyClass& k) const {
        return k.id();
    }
};

但是,MyClass 是在自定义命名空间中声明的。我认为使用全局范围解析运算符 ::,但这不起作用:

namespace mine {
    // ...

    template<>
    struct ::std::hash<MyClass> {
        // ...
    };
}

所以,我似乎想在一个命名空间的大括号内声明一些东西在另一个命名空间中。写下最后一句话让我意识到这可能是不可能的,但是将哈希函数放在它正在哈希的类附近的想法似乎是个好主意。

这可能吗?这方面的最佳做法是什么?

最佳答案

如您所见,如果您想为 std::hash 添加特化,则必须在 std 命名空间内完成。如果这是不可取的,另一种选择是将哈希仿函数保留在您的命名空间中,并将其作为模板参数传递给 unordered_set

namespace mine {

class MyClass { ... };

struct MyClass_hash {
  std::size_t operator()(const MyClass& k) const {
    return k.id();
  }
};

}

std::unordered_set<mine::MyClass, mine::MyClass_hash> my_set;

您还可以为 unordered_set 创建一个 typedef 以节省您自己的输入时间。

关于c++ - 如何声明一个哈希函数以用于命名空间内的 unordered_set?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22796594/

相关文章:

java 替代 angularJs watch

python - 在 C 中使用 hiredis 访问 redis 哈希

C++逐行读取并输出每一行

Javascript - 如何使用哈希获取文档引荐来源网址

C++ : How to programmatically define template types in runtime?

c++ - 保存 caffe 模型 C++ 源代码?

java - Java Map 键的奇怪输出

ruby - 在 ruby​​ on rails 中使用哈希

c++ - 如何在 qt 5.3.0 中使用 qml 分析器?

c++ - boost MPL::vector 未被识别且元状态机 (MSM) 转换表未定义