我正在尝试制作<string, int>
的地图。我试图将给定字符串的单个字符作为键值对的键。但是,我遇到了这个错误:
Line 7: no matching function for call to 'std::unordered_map<std::__cxx11::basic_string<char>, int>::find(__gnu_cxx::__alloc_traits<std::allocator<char> >::value_type&)'
这是我的代码:
int lengthOfLongestSubstring(string s) {
unordered_map<string, int> map;
int count = 0;
for (int i = 0; i < s.length(); i++) {
if (map.find(s[i]) == map.end()) {
count++;
map.insert(make_pair<string, int>(s[i], 1));
} else {
map.clear();
count = 0;
}
}
return count;
}
我认为错误是因为s [i]变成了char *因此我不能做make_pair,因为char *和string是不同的类型。
我试图通过这样做来解决这个问题:
string temp(s[i]); // Try to create a string from the char* and pass it into the make_pair function
然而,我仍然得到同样的错误。
答案 0 :(得分:2)
我认为错误是因为s [i]变成了char *因此我不能做make_pair,因为char *和string是不同的类型。
不,what s[i]
returns只是一个char
(更准确地说,是char&
引用),无法直接转换为std::string
。要从std::string
构造char
,您需要使用std::string
的不同构造函数,即:
basic_string( size_type count, CharT ch, const Allocator& alloc = Allocator() )
例如:
map.insert(make_pair<string, int>(string(1, s[i]), 1));
或者:
map.insert(make_pair<string, int>({1, s[i]}, 1));
答案 1 :(得分:0)
std::string::operator[]
返回(引用a)单个char
,而不是char*
指针。您无法仅从std::string
构建char
,这就是您收到错误的原因。要从std::string
构造char
,您需要使用以下构造函数之一:
basic_string(size_type count, CharT ch, const Allocator& alloc = Allocator());
basic_string(const CharT* s, size_type count, const Allocator& alloc = Allocator());
例如:
int lengthOfLongestSubstring(string s) {
unordered_map<string, int> map;
int count = 0;
for (int i = 0; i < s.length(); i++) {
string key(1, s[i]); // <-- here
// or: string key(&s[i], 1);
if (map.find(key) == map.end()) {
count++;
map.insert(make_pair(key, 1));
} else {
map.clear();
count = 0;
}
}
return count;
}
否则,请将std::unordered_map
密钥更改为char
,因为这是您实际使用的密钥:
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> map; // <-- here
int count = 0;
for (int i = 0; i < s.length(); i++) {
char key = s[i];
if (map.find(key) == map.end()) {
count++;
map.insert(make_pair(key, 1));
} else {
map.clear();
count = 0;
}
}
return count;
}
但是,实际上你根本没有使用映射的second
的{{1}}值,所以你根本不需要pair
,它只是浪费在头顶上。请考虑使用std::unordered_map
代替:
std::set