2008-08-30 5 views
4

Мне нужен ассоциативный контейнер, который заставляет меня индексировать определенный объект через строку, но также сохраняет порядок вставки, поэтому я могу искать конкретный объект по его имя или просто перебрать его и получить объекты в том же порядке, в который я их вставил.Я не понимаю std :: tr1 :: unordered_map

Я думаю, что это hybrid of linked list and hash map должно выполнить эту работу, но прежде чем я попытался использовать std::tr1::unordered_map, думая, что он работает таким образом, я описал это, но это не так. Так может кто-нибудь объяснить мне смысл и поведение unordered_map?


@wesc: Я уверен, что станд :: Карта осуществляется STL, в то время как я уверен, что станд :: hash_map НЕ в STL (я думаю, что более ранняя версия Visual Studio положить его в пространстве имен называемый stdext).

@cristopher: так, если я правильно понимаю, разница заключается в реализации (и, следовательно, в действиях), а не в том, как она ведет себя внешне.

ответ

4

Boost documentation of unordered containers

Разница заключается в способе, как вы генерировать взгляд вверх.

На картах/контейнерах operator< используется для генерации упорядоченного дерева.

В неупорядоченных контейнерах используется operator(key) => index.

См. Хеширование для описания того, как это работает.

0

I думаю что unordered_map и hash_map более или менее одно и то же. Разница в том, что STL официально не имеет hash_map (то, что вы используете, вероятно, является спецификой для компилятора), поэтому unordered_map является исправлением для этого упущения.

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

-3

@wesc: STL имеет std :: map ... так в чем разница с unordered_map? Я не думаю, что STL будет реализовывать дважды то же самое и называть его по-другому.

+3

карта выполнена со сбалансированным двоичным деревом с ее ограничениями и преимуществами. unordered_map - хеш-таблица. – 2009-04-10 16:22:35

0

Вы уверены, что std :: hash_map существует в все STL-реализации? SGI STL реализует его, однако GNU g ++ не имеет его (он находится в пространстве имен __gnu_cxx) по 4.3.1 в любом случае. Насколько я знаю, hash_map всегда был нестандартным, и теперь tr1 исправляет это.

2

Извините, прочитайте ваш последний комментарий неправильно. Да, hash_map не находится в STL, карта есть. Но unordered_map и hash_map совпадают с тем, что я читал.

карта -> журнал (п) вставка, поиск, итерация является эффективной (и по заказу сравнения ключей)

hash_map/unordered_map -> постоянной вставка и извлечение времени, время итерации не гарантируют, чтобы быть эффективным

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

Вам нужно будет либо описать (список + hash_map), либо создать тип ключа с порядковым номером вставки и соответствующей функцией сравнения.

7

Вы должны индексировать ассоциативный контейнер двумя способами:

  • порядка вставки
  • Сравнение строк

Boost.MultiIndex Попробуйте или Boost.Intrusive. Я не использовал его таким образом, но я думаю, что это возможно.

+0

Я знаю, что это очень старый вопрос, но поскольку некоторые ответы дают Boost Multi Index как решение потребностей OP, они верны, но любая рекомендация Boost multi Index IMO также должна иметь ссылки на Boost.Intrusive] (http : //www.boost.org/doc/libs/1_50_0/doc/html/intrusive.html). Более сложный в использовании, но часто более эффективный и гибкий – nhed 2012-08-01 11:23:19