无法在C ++中将char *作为字符串与<string,int =“”>配对

时间:2017-11-10 00:37:51

标签: c++ string dictionary

我正在尝试制作<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

然而,我仍然得到同样的错误。

2 个答案:

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