Почему я не могу передать структуру const map функции в С++?
Я попытался передать const с вектором, который он работает:
Пример:
void damn(const vector <bool> &bb)
{
for (int i=0; i<bb.size(); i++)
cout<<bb[i]<<endl;
}
Но при попытке с картой нет:
void pas(const map <string, float> &mm)
{
cout<<mm["a"];
cout<<mm["b"];
}
Интересно, почему это не так.
Ответы
Ответ 1
Я считаю, что это потому, что []
на карте не const
, так как он создает новую пару со значением по умолчанию, если вы обращаетесь к несуществующей. Попробуйте
void pas(const map <string, float> &mm)
{
cout<<mm.find("a")->second;
cout<<mm.find("b")->second;
}
Ответ 2
map::operator[]
немного странно. Он делает это:
- Ищите ключ.
- Если найдено, верните его.
- Если нет, вставьте его и по умолчанию создайте его связанное значение.
- Затем верните ссылку на новое значение.
Шаг 3 несовместим с const
ness. Вместо того, чтобы иметь две разные функциональные перегрузки operator[]
, язык заставляет вас использовать объекты map::find
для const
.
В качестве альтернативы можно утверждать, что бы сделать map::operator[] const
, если аргумент отсутствует на карте? Выбросить исключение? Undefined поведение? (В конце концов, то, что vector::operator[]
делает с индексом за пределами границ.) В любом случае проблему избегают с небольшим неудобством для нас.
my_map.find(key)
возвращает my_map.end()
, если key
не найден.
Ответ 3
std::map::operator[]
вставляет созданный по умолчанию элемент, если запрашиваемый элемент отсутствует на карте. Это почему это не функция-член const. Вместо этого вы можете использовать std::map::find
, но не забудьте проверить, что итератор возвращается.