Ответ 1
Что может сделать unordered_map
с подсказкой? Ну, если итератор обращается к элементу с тем же ключом, что и элемент, который был запрограммирован в emplace_hint
, он может быстро выйти из строя - просто ключевое сравнение без какого-либо хэширования или поиска в любом списке хеш-сталкивающихся элементов при этом ведро. Но если ключ не соответствует, то подсказка в противном случае бесполезна, потому что любой другой ключ - независимо от того, как "близко" по значению - должен (вероятностно) находиться в полностью несвязанном ведре (учитывая то, что обычно считается "хорошей" хэш-функцией), поэтому время было бы потрачено впустую на ключевое сравнение только для того, чтобы начать, как если бы это было нормально emplace
.
Это может быть полезно, когда вы вставляете предварительно отсортированные по ключу элементы, чтобы удалить много дубликатов в процессе, но ключ настолько огромен, что проще сохранить итератор только что вставленному элементу, чем копия ключа или, может быть, хэш-функция особенно медленная.
Другим преимуществом unordered_map::emplace_hint
является улучшенная совместимость API с map::emplace_hint
, поэтому код может переключать тип контейнера и emplace_hint
не прерывать компиляцию, хотя они могут оказаться медленнее, чем если бы код был переключен на emplace()
, поскольку подсказки с близким, но разным ключом, которые помогают с map
, могут быть бесполезны с помощью unordered_map
.