【问题标题】:Invalid operands to binary expression when using unordered_map?使用 unordered_map 时二进制表达式的操作数无效?
【发布时间】:2020-12-27 03:24:11
【问题描述】:

我正在尝试查找我的字符哈希表是否包含字符串的第一个字符:

string minWindow(string s, string t) {
    unordered_map<char, int> charFinder;
    for (int i = 0; i < t.length(); ++i) {
        charFinder[t[i]] = 0;
    }
    cout << charFinder.find(s[0]) == charFinder.end() << endl;
    return "hi";
}

但由于某种原因,我收到此错误。这对我来说没有任何意义。有人有什么想法吗?

第 8 行:字符 14:错误:二进制表达式的无效操作数 ('std::ostream' (aka 'basic_ostream') 和 'std::unordered_map, std: :equal_to, std::allocator<:pair char int> > >::iterator' (又名 '_Node_iterator<:pair char int>, __constant_iterators::value, __hash_cached: :值>')) cout ”)到“std::byte”的已知转换 operator

我切断了长错误消息的其余部分。

【问题讨论】:

    标签: c++


    【解决方案1】:

    根据Operator Precedenceoperator&lt;&lt; 的优先级高于operator==,因此您的cout 表达式:

    cout << charFinder.find(s[0]) == charFinder.end() << endl;
    

    正在评估,就好像你是这样写的:

    (cout << charFinder.find(s[0])) == (charFinder.end() << endl);
    

    编译器错误抱怨将std::unordered_map 本身传递给operator&lt;&lt;,这不是您想要的。更仔细地查看错误消息,这正是它所指出的。 std::ostream 没有 operator&lt;&lt;std::unordered_map 作为输入。

    要解决这个问题,你需要明确地使用括号来告诉编译器你真正想要什么,例如:

    cout << (charFinder.find(s[0]) == charFinder.end()) << endl;
    

    否则,请改用bool 变量:

    bool notFound = charFinder.find(s[0]) == charFinder.end();
    cout << notFound << endl;
    

    在 C++20 中,您可以使用 std::unordered_map::contains() 代替:

    cout << charFinder.contains(s[0]) << endl;
    

    话虽如此,由于您实际上根本没有使用字符数,因此您应该使用std::set 而不是std::unordered_map,例如:

    string minWindow(string s, string t) {
        set<char> charFinder;
        for (int i = 0; i < t.length(); ++i) {
            charFinder.insert(t[i]);
        }
        //
        // alternatively:
        // set<char> charFinder(t.begin(), t.end());
    
        cout << (charFinder.find(s[0]) == charFinder.end()) << endl;
        //
        // alternatively:
        // bool notFound = charFinder.find(s[0]) == charFinder.end();
        // cout << notFound << endl;
        //
        // alternatively:
        // cout << charFinder.contains(s[0]) << endl;
    
        return "hi";
    }
    

    【讨论】:

      【解决方案2】:

      这个说法有问题:

      cout << charFinder.find(s[0]) == charFinder.end() << endl;
      

      流插入运算符 &lt;&lt; 的优先级高于相等运算符 ==

      语句同:

      ((cout << charFinder.find(s[0])) == charFinder.end()) << endl;
      

      std::cout 的重载运算符&lt;&lt; 返回对std::cout 的引用。

      当编译器遇到您将std::ostream 对象(std::cout)与std::unordered_map.end() 返回的iterator 进行比较时,它会发出错误,因为std::ostream 没有重载运算符==将自己与iterator 进行比较。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多