Обоснование семантики вставки стандартной карты C++?

Меня немного смущает семантика std::map::insert. В смысле, я не жалуюсь — стандарт есть стандарт, а API такой, какой он есть. Тем не менее,

вставитьбудет

операция вставки проверяет для каждого вставленного элемента, является ли другой элемент уже существует в контейнере с тем же ключом значение, если да, то элемент не вставляется и его отображаемое значение не как-то изменился.

И - только в своей версии с одним аргументом pair insert ( const value_type& x );он даже сообщит вам, вставило ли оно (новое, возможно, другое) значение в ключ(и). Насколько я понимаю, версии итераторов будут молча игнорировать вставки, если ключ уже существует.

Для меня это просто противоречит интуиции, я ожидал, что часть значения будет перезаписана, а старая часть значения будет отброшенапри вставке.Очевидно, разработчики STL думали по-другому — кто-нибудь знает (историческое) обоснование или может дать подробное объяснение того, как существующая семантика имеет (больше) смысла?

Например:

Существует несколько основных способов реализации вставки в карту с одним ключом, например std::map:

  • вставка, замена, если она уже существует
  • вставка , игнорировать, если уже существует ( это поведение std::map)
  • вставить, выдать ошибку, если уже существует
  • вставить, UB, если уже существует

Сейчас я пытаюсь поймите, почему вставка_или_игнорироватьимеет больше смысла, чем вставка_или_замена(или вставка_или_ошибка)!


Я заглянул в свою копию TC++PL(к сожалению, у меня есть только немецкое издание), и, что интересно, Страуструп пишет в главе 17.4.1.7 (список операций для map): (извините, грубый перевод с немецкого)

(...) Обычно не важно, является ли ключ (sic!) новым. вставлен или уже существовал до вызова insert()(...)

Что, как мне кажется, справедливо только для set, а не для map, потому что для карты имеет большое значение, было ли вставлено предоставленное значение или старое осталось на карте. (Очевидно, что это не имеет значения для ключа, так как он эквивалентен.)


Примечание: я знаю об операторе []и я знаю о пункте 24 Эффективный STL. и предложенная там функция EffectiveAddOrUpdate .Мне просто любопытно объяснить семантику insert, потому что лично я нахожу их нелогичными.

25
задан chappjc 19 March 2014 в 01:35
поделиться