C ++ карта вопросы о синтаксисе - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь узнать больше о картах в целом: я никогда раньше не видел такой синтаксис: charMap [c] ++; я предполагаю, что это добавляет символ в качестве ключа? и увеличивая счет как значение? Может ли кто-нибудь указать, где я могу увидеть эту запись? Кажется, я не могу найти какую-либо информацию об этом.

int firstUniqChar(string s) {
    unordered_map<char, int> charMap;
    for (char c : s)
        charMap[c]++;            
}

Также мне было интересно, почему я получаю ошибку, когда пытаюсь вставить карту, но она работает, когда я делаю карту?

int firstUniqChar(string s) {
    map<string,int> myMap;

    for( int i=0; i<s.length(); i++){
       auto it = myMap.insert({s[i],1});
        if(!it.second){
            it.first->second+=1;      
        }

    }
    auto itr = myMap.begin();
    while(itr!=myMap.end()){

        cout<<it->first;
        it++;
    }

}

Ответы [ 3 ]

2 голосов
/ 23 марта 2020
unordered_map<char, int> charMap;
charMap[c]++;

std :: map :: operator [] :

Возвращает ссылку на значение, сопоставленное ключу, эквивалентному ключу, выполняя вставку если такой ключ еще не существует.

Итак, charMap[c] возвращает ссылку на сопоставленный int, который увеличивается с ++.

auto it = myMap.insert({s[i], 1});

Нет соответствия insert перегрузка. Попробуйте использовать emplace:

auto it = myMap.emplace(s[i], 1);

Редактировать: я только что заметил, что вы изменили на map с string в качестве ключа во второй части кода и что вы, вероятно, пытаетесь создать string из char s[i] с длиной 1, когда вы делаете {s[i],1}, но это не так. Сначала идет счет, затем char - ему также не хватает значения .

При использовании insert это может выглядеть так, как показано ниже. Я использую структурированные привязки, чтобы было легче увидеть, что к чему.

map<string,int> myMap;

for(size_t i=0; i<s.length(); i++){
   // create a string of length 1 mapped to the value 1
   auto [it, inserted] = myMap.insert({{1, s[i]}, 1});
   auto& [key, value] = *it;
   if(inserted == false) {
       ++value;
   }
}
0 голосов
/ 23 марта 2020

Одна важная вещь, почему это работает как положено: когда ключ вставлен в карту, он инициализируется нулями в соответствии со спецификацией оператора []

0 голосов
/ 23 марта 2020
charMap[c]++;

Это оператор постинкрементного увеличения. Увеличивает ссылку, возвращаемую на charMap[c], затем возвращает старое значение.

...