我正在尝试查找我的字符哈希表是否包含字符串的第一个字符:
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 ^
我切断了长错误消息的其余部分。
对于运算符优先级,运算符<<
的优先级高于运算符==
,因此您的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
没有重载运算符==
来将自身与迭代器
进行比较。