当前位置: 首页 > 知识库问答 >
问题:

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

左丘季
2023-03-14

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

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个答案

微生景胜
2023-03-14

这个说法有问题:

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没有重载运算符==来将自身与迭代器进行比较。

百里泓
2023-03-14

对于运算符优先级,运算符<<的优先级高于运算符==,因此您的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";
}
 类似资料:
  • 问题内容: 我有以下代码,出现错误“ PHP致命错误:常量表达式包含无效操作”。当我在构造函数中定义变量时,它可以正常工作。我正在使用Laravel框架。 我已经看到了这个问题:PHP错误:致命错误:常量表达式包含无效的操作,但是我的代码未将任何内容声明为静态,因此无法回答我的问题。 问题答案: 如上所述这里 类成员变量称为“属性”。您可能还会看到使用其他术语(例如“属性”或“字段”)来引用它们,

  • 赋值 计算赋值 多重赋值 范围表达式 and or not 条件操作符 例: 1+2*3/4 为了便于编程,有些方法调用和控制结构是以操作符的形式出现的。Ruby语言中有下列操作符。 高 :: [] +(单项) ! ~ ** -(单项) * / % + - << >>

  • Blob对象 FileList对象 File对象 FileReader对象 综合实例:显示用户选取的本地图片 URL对象 参考链接 历史上,JavaScript无法处理二进制数据。如果一定要处理的话,只能使用charCodeAt()方法,一个个字节地从文字编码转成二进制数据,还有一种办法是将二进制数据转成Base64编码,再进行处理。这两种方法不仅速度慢,而且容易出错。ECMAScript 5引入

  • Blob对象 FileList对象 File对象 FileReader对象 综合实例:显示用户选取的本地图片 URL对象 参考链接 历史上,JavaScript无法处理二进制数据。如果一定要处理的话,只能使用charCodeAt()方法,一个个字节地从文字编码转成二进制数据,还有一种办法是将二进制数据转成Base64编码,再进行处理。这两种方法不仅速度慢,而且容易出错。ECMAScript 5引入

  • 问题内容: 我有一个混合二进制数据和文本数据的文件。我想通过正则表达式解析它,但出现此错误: 我猜该消息意味着Python不想解析二进制文件。我正在打开带有标志的文件。 如何在Python中使用正则表达式解析二进制文件? 编辑: 我正在使用Python 3.2.0 问题答案: 我认为您使用Python 3。 1.以 二进制模式 打开文件很简单但是很微妙。与在文本模式下打开它的唯一区别是mode参数

  • 我知道你们会抱怨这个问题被一遍又一遍地问。抱歉,我在Google/Stackoverflow/Forums中没有找到我的答案...等等 我正在用Java创建一个数组二叉树(不是搜索树)。 1) 我的节点具有以下属性:父节点、左节点和右节点。它们是父级、左子级和右子级的索引数。我的教授告诉我这样做,我不知道为什么,因为你可以用公式找到父母和孩子的索引,我希望有人告诉我,添加父母/左/右的索引如何帮助