2014-04-02 7 views
10

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

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

ответ

14

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

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

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

+0

Я не получил этот ответ полностью .. возможно, это из-за того, как это сформулировано. Так что это бесполезно, если я не предварительно заказал несколько ключей? – Dean

+0

@Dean: вам необязательно иметь «предварительно заказанные несколько ключей» - может быть, порядок, в котором они, естественно, происходят, означает, что повторяющиеся ключи имеют достаточно высокую вероятность появления последовательности, чтобы сохранить итератор последнее значение стоит, поскольку вы могли бы быстро отклонить дубликат. Тем не менее, все это основано на единственном возможном использовании намека, о котором я могу думать, - если ваша реализация на самом деле не использует подсказку, вы тратите время и силы на ее поставку. –

Смежные вопросы