【问题标题】:C++ unordered map - no viable overloaded operator[]C ++ unordered_map - 没有可行的重载运算符[]
【发布时间】:2019-09-25 22:02:09
【问题描述】:

我正在尝试构建一个值的备忘录,使用 unordered_map 将一对 int 链接到一个 int。

int memo(pair<int, int> &p, unordered_map<pair<int, int>, int> &memo) {
    if (memo[p] != -1) {
    }
}

我以为我会使用 pair 访问 unordered_map 中的值,但我得到了一个错误:

'operator[]' 不匹配(操作数类型为 'std::unordered_map<:pair int>, int>' 和 'std::pair')

【问题讨论】:

    标签: c++


    【解决方案1】:

    您正在尝试使用std::pair 作为 unordered_map 的键,因为 std::pair 的散列没有明确定义,所以默认情况下未定义。您需要为您的 std::pair 键定义一个哈希值。

    https://www.techiedelight.com/use-std-pair-key-std-unordered_map-cpp/

    链接示例:

    #include <iostream>
    #include <unordered_map>
    #include <utility>
    
    typedef std::pair<std::string,std::string> pair;
    
    struct pair_hash
    {
        template <class T1, class T2>
        std::size_t operator() (const std::pair<T1, T2> &pair) const
        {
            return std::hash<T1>()(pair.first) ^ std::hash<T2>()(pair.second);
        }
    };
    
    int main()
    {
        std::unordered_map<pair,int,pair_hash> unordered_map =
        {
            {{"C++", "C++11"}, 2011},
            {{"C++", "C++14"}, 2014},
            {{"C++", "C++17"}, 2017},
            {{"Java", "Java 7"}, 2011},
            {{"Java", "Java 8"}, 2014},
            {{"Java", "Java 9"}, 2017}
        };
    
        for (auto const &entry: unordered_map)
        {
            auto key_pair = entry.first;
            std::cout << "{" << key_pair.first << "," << key_pair.second << "}, "
                      << entry.second << '\n';
        }
    
        return 0;
    }
    

    【讨论】:

    • 这两个标准容器开箱后不能一起工作真是太烦人了。
    • 是的。问题来自 std::map 和 std::unordered_map 之间的差异。 std::map 使用 operator
    猜你喜欢
    • 1970-01-01
    • 2015-06-24
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多