Почему set/map emplace_hint не возвращает логическое значение
В соответствии с cppreference функции std::set
и std::map
emplace
возвращают a std::pair<iterator,bool>
, с значением bool
, чтобы сказать if вставка действительно имела место.
Однако emplace_hint
возвращает iterator
либо вставленному элементу, либо существующему элементу в наборе или карте, если вставка не выполнялась. Здесь нет значения bool
.
Есть ли причина для этой разницы в интерфейсе этих подобных функций?
Обновление
Функция insert
возвращает значение bool
только при отсутствии подсказки. Это согласуется с поведением emplace
и emplace_hint
. Возникает вопрос: есть ли причина не возвращать bool
, когда дается подсказка?
Я могу только подумать, что, возможно, есть причина в производительности, потому что пользователь обычно дает подсказку после операции lower_bound
/upper_bound
, поэтому она уверен, что вставка произойдет.
Ответы
Ответ 1
emplace_hint
делает ли это вероятным совпадение с намеченным insert
: emplace
было изначально предложенным как пара перегрузок, зеркалирование insert
, но намеченная перегрузка была переименована после LWG 763, хотя Josuttis хотел переименуйте не намеченную версию)
Указанный insert
для ассоциативных контейнеров принимает итератор и значение и возвращает итератор, чтобы быть совместимым с обычным insert
в последовательных контейнерах в общем коде. как упоминалось в книге Йосуттиса. Эта совместимость используется std:: inserter