Я почти уверен, что где-то уже видел этот вопрос (comp.lang.c ++? Google, похоже, не нашел его там), но быстрый поиск здесь, похоже, не нашел его, так что вот он:
Почему оператор std :: map [] создает объект, если ключ не существует? Я не знаю, но для меня это кажется нелогичным, если сравнивать с большинством других операторов operator [] (например, std :: vector), где, если вы используете его, вы должны быть уверены, что индекс существует. Мне интересно, в чем причина реализации такого поведения в std :: map. Как я уже сказал, не было бы более интуитивно понятным действовать больше как индекс в векторе и сбой (ну, я думаю, неопределенное поведение) при доступе с недопустимым ключом?
Уточняю свой вопрос после просмотра ответов:
Хорошо, пока я получил много ответов, в которых говорилось, что в основном это дешево, так почему бы и нет, или что-то подобное. Я полностью согласен с этим, но почему бы не использовать для этого специальную функцию (я думаю, что в одном из комментариев говорилось, что в java нет оператора [] и функция называется put)? Я хочу сказать, почему оператор карты [] не работает как вектор? Если я использую operator [] для индекса вне диапазона вектора, я бы не хотел, чтобы он вставлял элемент , даже если он был дешевым, потому что это, вероятно, означает ошибку в моем коде. Я хочу сказать, почему с картой не то же самое. Я имею в виду, что для меня использование operator [] на карте означало бы: я знаю, что этот ключ уже существует (по какой-то причине я просто вставил его, у меня где-то есть избыточность, что угодно). Я думаю, так было бы более интуитивно.
Тем не менее, каковы преимущества выполнения текущего поведения с помощью operator [] (и только для этого я согласен с тем, что должна присутствовать функция с текущим поведением, а не operator [])? Может быть, это даст более четкий код? Я не знаю.
Другой ответ заключался в том, что он уже существовал таким образом, так почему бы не сохранить его, но тогда, возможно, когда они (те, которые были до stl) решат реализовать его таким образом, они обнаружили, что это дает преимущество или что-то в этом роде? Итак, мой вопрос в основном таков: почему я решил реализовать это таким образом, имея в виду некоторую несогласованность с другим оператором []. Какую пользу это дает?
Спасибо
const
версия оператора подписки, я готов заплатить цену исключения, чтобы действительно избежать использованияmap::find
+map::end
. - person Matthieu M.   schedule 29.10.2009map::count
. - person anilbey   schedule 27.08.2019