Что возвращает карта 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']?
Ответы
Ответ 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()
, если ключ не найден.
И никакой дополнительный ключ не будет добавлен автоматически
И, очевидно, вы можете использовать оператор []
, когда вы устанавливаете значение для ключа