Меня немного смущает семантика std::map::insert
. В смысле, я не жалуюсь — стандарт есть стандарт, а API такой, какой он есть. Тем не менее,
вставить
будет
операция вставки проверяет для каждого вставленного элемента, является ли другой элемент уже существует в контейнере с тем же ключом значение, если да, то элемент не вставляется и его отображаемое значение не как-то изменился.
И - только в своей версии с одним аргументом pair
он даже сообщит вам, вставило ли оно (новое, возможно, другое) значение в ключ(и). Насколько я понимаю, версии итераторов будут молча игнорировать вставки, если ключ уже существует.
Для меня это просто противоречит интуиции, я ожидал, что часть значения будет перезаписана, а старая часть значения будет отброшенапри вставке.Очевидно, разработчики STL думали по-другому — кто-нибудь знает (историческое) обоснование или может дать подробное объяснение того, как существующая семантика имеет (больше) смысла?
Например:
Существует несколько основных способов реализации вставки в карту с одним ключом, например std::map
:
Сейчас я пытаюсь поймите, почему вставка_или_игнорировать
имеет больше смысла, чем вставка_или_замена
(или вставка_или_ошибка
)!
Я заглянул в свою копию TC++PL(к сожалению, у меня есть только немецкое издание), и, что интересно, Страуструп пишет в главе 17.4.1.7 (список операций для map): (извините, грубый перевод с немецкого)
(...) Обычно не важно, является ли ключ (sic!) новым. вставлен или уже существовал до вызова
insert()
(...)
Что, как мне кажется, справедливо только для set, а не для map, потому что для карты имеет большое значение, было ли вставлено предоставленное значение или старое осталось на карте. (Очевидно, что это не имеет значения для ключа, так как он эквивалентен.)
Примечание: я знаю об операторе []
и я знаю о пункте 24 Эффективный STL. и предложенная там функция EffectiveAddOrUpdate
.Мне просто любопытно объяснить семантику insert
, потому что лично я нахожу их нелогичными.