其他分享
首页 > 其他分享> > c – 为什么我不能用一对作为键编译unordered_map?

c – 为什么我不能用一对作为键编译unordered_map?

作者:互联网

我正在尝试创建一个unordered_map来映射带有整数的对:

#include <unordered_map>

using namespace std;
using Vote = pair<string, string>;
using Unordered_map = unordered_map<Vote, int>;

我有一个类,我已将Unordered_map声明为私有成员.

但是,当我尝试编译它时,我收到以下错误:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/type_traits:948:38: Implicit instantiation of undefined template ‘std::__1::hash, std::__1::basic_string > >’

如果我使用像map< pair< string,string>,int>这样的常规地图,我不会收到此错误而不是unordered_map.

是否无法在无序地图中使用对作为关键字?

解决方法:

您需要为密钥类型提供合适的哈希函数.一个简单的例子:

#include <unordered_map>
#include <functional>
#include <string>
#include <utility>

// Only for pairs of std::hash-able types for simplicity.
// You can of course template this struct to allow other hash functions
struct pair_hash {
    template <class T1, class T2>
    std::size_t operator () (const std::pair<T1,T2> &p) const {
        auto h1 = std::hash<T1>{}(p.first);
        auto h2 = std::hash<T2>{}(p.second);

        // Mainly for demonstration purposes, i.e. works but is overly simple
        // In the real world, use sth. like boost.hash_combine
        return h1 ^ h2;  
    }
};

using Vote = std::pair<std::string, std::string>;
using Unordered_map = std::unordered_map<Vote, int, pair_hash>;

int main() {
    Unordered_map um;
}

这将工作,但没有最好的哈希属性†.在组合哈希时,您可能希望查看类似boost.hash_combine的内容以获得更高质量的结果.

对于实际使用:Boost还提供了功能集hash_value,它已经为std :: pair提供了一个哈希函数,以及std :: tuple和大多数标准容器.

†更准确地说,它会产生太多的碰撞.例如,每个对称对将散列为0,并且仅通过排列而不同的对将具有相同的散列.这可能适合您的编程练习,但可能严重损害现实代码的性能.

标签:unordered-map,c,dictionary,keyvaluepair
来源: https://codeday.me/bug/20190916/1808188.html