Что может сделать unordered_map
с подсказкой? Ну, если итератор обращается к элементу с тем же ключом, что и элемент, который был запрошен вставить emplace_hint
, он может быстро сработать - просто сравнение ключей без какого-либо хэширования или поиска в любом списке хеш-сталкивающихся элементов в этом ведре. Но если ключ не совпадает, то подсказка в противном случае бесполезна, потому что любой другой ключ - независимо от того, как «близко» по значению - должен (вероятностно) находиться в полностью несвязанном ведре (учитывая то, что обычно считается «хорошей» хэш-функцией), поэтому время было бы потрачено впустую на ключевое сравнение только для того, чтобы начать, как если бы это был нормальный emplace
.
Это может быть полезно, если вы вставляете предварительно отсортированные по ключу элементы, направленные на удаление большого количества дубликатов в процессе, но ключ настолько огромен, что проще сохранить итератор только что вставленному элементу чем копия ключа, или, может быть, хеш-функция особенно медленна.
Еще одно преимущество unordered_map::emplace_hint
лучше совместимость API с map::emplace_hint
, поэтому код может переключать тип контейнера и имеют emplace_hint
ы не нарушить компиляции, хотя они могли бы в конечном итоге медленнее, чем если бы код был переключен на emplace()
как близок но разные подсказки, которые помогают с map
, могут быть бесполезны с помощью unordered_map
.
Я не получил этот ответ полностью .. возможно, это из-за того, как это сформулировано. Так что это бесполезно, если я не предварительно заказал несколько ключей? – Dean
@Dean: вам необязательно иметь «предварительно заказанные несколько ключей» - может быть, порядок, в котором они, естественно, происходят, означает, что повторяющиеся ключи имеют достаточно высокую вероятность появления последовательности, чтобы сохранить итератор последнее значение стоит, поскольку вы могли бы быстро отклонить дубликат. Тем не менее, все это основано на единственном возможном использовании намека, о котором я могу думать, - если ваша реализация на самом деле не использует подсказку, вы тратите время и силы на ее поставку. –