提问者:小点点

使用unordered_map时二进制表达式的操作数无效?


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

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";
}

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

Line 8: Char 14: error: invalid operands to binary expression ('std::ostream' (aka 'basic_ostream<char>') and 'std::unordered_map<char, int, std::hash<char>, std::equal_to<char>, std::allocator<std::pair<const char, int> > >::iterator' (aka '_Node_iterator<std::pair<const char, int>, __constant_iterators::value, __hash_cached::value>'))
        cout << charFinder.find(s[1]) == charFinder.end() << endl;
        ~~~~ ^  ~~~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/cstddef:124:5:
note: candidate function template not viable: no known conversion from 'std::ostream' (aka 'basic_ostream<char>') to 'std::byte' for 1st argument
    operator<<(byte __b, _IntegerType __shift) noexcept
    ^

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


共2个答案

匿名用户

对于运算符优先级,运算符<<的优先级高于运算符==,因此您的COUT表达式:

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

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

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

编译器错误是抱怨将std::unordered_map本身传递给运算符<<,这不是您想要的。更仔细地查看错误消息,这正是它所指出的。对于std::ostream不存在以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";
}

匿名用户

这个说法有问题:

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

流插入运算符<<比相等运算符==具有更高的优先级。

声明与:

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

std::cout的重载运算符<<返回对std::cout的引用。

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