使用pair作为键的unordered_map构建失败(C ++)

问题描述 投票:3回答:1

我认为有可能使用qazxsw poi作为qazxsw poi的关键。在我的情况下,我需要在对中使用std::pair。但是在构建它时遇到一些问题。我的代码是:

std::unordered_map

得到错误:

std::type_index

这里的语法有什么问题?

c++ hash unordered-map std-pair
1个回答
3
投票

根据哈希要求,template<class Base, class Result, bool Commutative> struct Multimethod2 { using Args = std::pair<std::type_index, std::type_index>; using Method = std::function<bool(Base *, Base *)>; struct ArgsHash { std::size_t operator () (Args &p) const { std::size_t h1 = std::hash<std::type_index>()(p.first); std::size_t h2 = std::hash<std::type_index>()(p.second); return h1 ^ h2; } }; struct KeyEqual { bool operator()(const Args &a1, const Args &a2) const { return (a1.first == a2.first && a1.second == a2.second) || (a1.first == a2.second && a1.second == a2.first); } }; std::unordered_map<Args, Method, ArgsHash, KeyEqual> methods; ... } 应该通过/usr/include/c++/7/bits/hashtable_policy.h:87: error: no match for call to ‘(const Multimethod2<Shape, bool, true>::ArgsHash) (const std::pair<std::type_index, std::type_index>&)’ noexcept(declval<const _Hash&>()(declval<const _Key&>()))> ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~ /usr/include/c++/7/bits/hashtable_policy.h:87: error: binding reference of type ‘Multimethod2<Shape, bool, true>::Args& {aka std::pair<std::type_index, std::type_index>&}’ to ‘const std::pair<std::type_index, std::type_index>’ discards qualifiers noexcept(declval<const _Hash&>()(declval<const _Key&>()))> ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~ /usr/include/c++/7/type_traits:154: error: ‘value’ is not a member of ‘std::__and_<std::__is_fast_hash<Multimethod2<Shape, bool, true>::ArgsHash>, std::__detail::__is_noexcept_hash<std::pair<std::type_index, std::type_index>, Multimethod2<Shape, bool, true>::ArgsHash> >’ : public integral_constant<bool, !_Pp::value> ^~~~ ... 获取ArgsHash::operator()

顺便说一下,你的哈希函数可能很糟糕(当你有两个相同的type_index时会发生什么?)

组合哈希并非易事(这就是为什么没有std :: hash_combine的原因);无论如何,您可能想尝试使用boost.hash_combine来制作一个现成的或多或少的通用解决方案......

© www.soinside.com 2019 - 2024. All rights reserved.