Когда вы используете std:: unordered_map:: emplace_hint?

Я знаю, как использовать std::unordered_map::emplace, но как использовать emplace_hint? Ни cplusplus, ни cppreference не представляют собой набор примеров, которые иллюстрируют, как мы можем знать, куда положить элемент.

Может ли кто-нибудь предоставить некоторую информацию об этом или дать некоторые примеры/иллюстрации, когда мы можем знать, куда должен идти элемент emplaced?

Ответ 1

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

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

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