Подтвердить что ты не робот

Что возвращает карта STL [key], если ключ не был инициализированным ключом на карте?

Вот пример кода:

 #include<iostream>
 #include<map>
 #include<string>
 using namespace std;

 int main()
 {
   map<char, string> myMap;
   myMap['a'] = "ahh!!";
   cout << myMap['a'] << endl << myMap['b'] << endl;
   return 0;
 }

В этом случае мне интересно, что возвращает myMap ['b']?

4b9b3361

Ответ 1

Встроенные модули std::string по умолчанию вставляются в std::map с ключом 'b' и возвращается ссылка на него.

Часто полезно обратиться к документации, которая определяет поведение operator[] как:

Возвращает ссылку на объект, связанный с определенным ключом. Если карта еще не содержит такого объекта, operator[] вставляет объект по умолчанию data_type().

(Документация SGI STL не является документацией для стандартной библиотеки C++, но она по-прежнему является неоценимым ресурсом, поскольку большая часть поведения контейнеров стандартной библиотеки такая же или очень близка к поведению контейнеров SGI STL.)

Ответ 2

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

Это действительно возвращается, даже когда вы говорите map['a'] = "ahh!!";. Оператор [] вводит построенную по умолчанию строку в позиции 'a' и возвращает ссылку на нее, которая затем вызывается оператором =.

Ответ 3

std::map operator[] вставляет построенный тип значения по умолчанию в карту, если ключ, предоставленный для поиска, не существует. Таким образом, вы получите пустую строку в результате поиска.

Ответ 4

Если вы попытаетесь получить доступ к значению ключа с помощью оператора индексирования [], тогда могут произойти две вещи:

  • Карта содержит этот ключ. Таким образом, он вернет соответствующее значение ключа
  • Карта не содержит ключа. В этом случае он будет automatically add a key к карте с помощью key value null.

Поскольку ключ 'b' отсутствует на вашей карте, поэтому он автоматически добавит этот ключ со значением "" (пустая строка), и он напечатает эту пустую строку.

И размер карты будет увеличен на 1

Итак, чтобы найти ключ, вы можете использовать .find(), который вернет map.end(), если ключ не найден.
И никакой дополнительный ключ не будет добавлен автоматически

И, очевидно, вы можете использовать оператор [], когда вы устанавливаете значение для ключа