2013-03-21 5 views
22

std::map имеет метод insert, который принимает итератор «подсказки», который уменьшит время вставки из log (n) до постоянного времени, если подсказка верна. Его довольно очевидно, как это будет работать, поскольку контейнер может просто убедиться, что у недавно добавленного элемента есть ключ, который меньше подсказки и имеет ключ, который больше, чем элемент перед подсказкой. В противном случае подсказка была неправильной, и она выполняет обычную вставку.std :: unordered_map insert with hint

std::unordered_map также имеет аналогичный insert с функцией подсказки. Что, если что-нибудь, делает намек? Для меня не очевидно, как другой итератор «подсказки» можно было бы использовать для ускорения ввода хэш-карты.

Если используется, то подходящий «намек». В std::map подсказку обычно можно найти по телефону lower_bound на карте.

+12

Я думаю, что перегрузка подсказки предназначена для совместимости интерфейса с обычной 'std :: map', так как вам нужно будет точно знать, где хеш для вашего значения должен быть вставлен, чтобы делать что-нибудь полезное - что означает, что вы необходимо учитывать нагрузку, ведра и т. д., в основном воспроизводя то, что 'unordered_map' делает внутренне. Кроме того, как вы отметили, вставка в любом случае амортизируется O (1). – Xeo

+0

Чтобы быть ясным, вы говорите, что ничего не делает? Это то, что я догадался ... это просто для совместимости. – pauld

ответ

14

Это проблема совместимости интерфейса. В принципе, дизайн выполняется с учетом интерфейса std::map.

Другими словами, для std::unordered_map он не отличается подсказкой или нет.

Дополнительная информация из комментариев здесь:

Совместимость интерфейса очень важно, потому что быть в состоянии быстро/легко переключаться между map и unordered_map обеспечивает ценную гибкость безболезненного перехода, поскольку производительность часто является решающим фактором выбирая один над другим.

+7

+1 Да, совместимость интерфейса очень важна для общего кода (например, где контейнер является параметром шаблона: 'template '). Быстрое/простое переключение между 'map' и' unordered_map' очень важно, так как производительность часто является решающим фактором при выборе одного из них. –

+4

@HowardHinnant: как отмечено в OP, подсказка обычно получается по вызову map :: lower_bound(), а unordered_map не имеет этого метода (потому что это бесполезно для неупорядоченного контейнера). Разве это не означает, что совместимость интерфейса по-прежнему не предоставляется? –

+0

@AndyT: Существуют явные пределы совместимости интерфейса. Однако 'find' и' equal_range' являются другими богатыми источниками итераторов, которые можно найти в обоих API. Если переключение назад и вперед является важной целью для вас, вы придерживаетесь общего подмножества API. Комитет сделал все возможное, чтобы сделать подмножество настолько большим, насколько это практически возможно, например, позволяя вам давать бесполезный намек при вставке в unordered_map. –

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