1

MyClass定义operator==并具有非平凡的内部状态,但它确实提供了一种wstring toString()方法,该方法返回该状态的序列化版本。toString()所以我认为使用hash<wstring>on会很容易std::unordered_set

但是是否可以在不定义无关函子类的情况下以一种很好的方式做到这一点?在迁移到 VS2013 之后,我才刚刚开始掌握 C++11,我认为这是向前迈出的一大步,能够定义诸如 lambdas 之类的东西?

感谢任何建议如何最好地做到这一点。

4

2 回答 2

3
auto hasher = [](const MyClass &m){ return std::hash<std::wstring>()(m.toString()); };
std::unordered_set<MyClass, decltype(hasher)> set(10, hasher);

不幸的是,由于一个错误,这目前不适用于 MSVC 。

可能的解决方法包括编写 for 的特化std::hashMyClass或将 lambda 存储在 a 中std::function<std::size_t(const MyClass &)>并将其用作哈希器的类型:

std::function<std::size_t(const MyClass &)> hasher = 
                [](const MyClass &m) { return std::hash<std::wstring>()(m.toString()); };
std::unordered_set<MyClass, std::function<std::size_t(const MyClass &)>> set(10, hasher);
于 2014-10-09T16:19:55.680 回答
0

最好的方法是告诉std::hash如何MyClass通过专业化散列:

namespace std {
template <>
struct hash<MyClass> {
  std::size_t operator () (const MyClass& mc) const {
    return std::hash<std::wstring>()(mc.toString());
  }
};
} // namespace std

因此您无需为unordered_setor的非默认模板参数操心unordered_map

于 2014-10-09T16:54:03.070 回答