Есть ли преимущество использования map перед unordered_map в случае тривиальных ключей? - PullRequest
330 голосов
/ 04 февраля 2010

Недавний разговор о unordered_map в C ++ заставил меня понять, что я должен использовать unordered_map для большинства случаев, когда я использовал map из-за эффективности поиска ( амортизированный O (1) против O (log n) ). В большинстве случаев я использую карту, я использую int или std::strings в качестве ключей, поэтому у меня нет проблем с определением хеш-функции. Чем больше я думал об этом, тем больше осознавал, что не могу найти никакой причины использования std::map в случае простых типов над unordered_map - я посмотрел на интерфейсы и не стал Не могу найти каких-либо существенных различий, которые могли бы повлиять на мой код.

Отсюда возникает вопрос - есть ли реальная причина использовать std::map над unordered map в случае простых типов, таких как int и std::string?

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

Также я ожидаю, что один из правильных ответов может быть «он более эффективен для небольших наборов данных» из-за меньших издержек (это правда?) - поэтому я бы хотел ограничить вопрос к случаям, когда количество ключей нетривиально (> 1 024).

Редактировать: Да, я забыл очевидное (спасибо GMan!) - да, карты, конечно, упорядочены - я знаю это, и ищу другие причины.

Ответы [ 12 ]

0 голосов
/ 28 августа 2018

Небольшое дополнение ко всему вышеперечисленному:

Лучше использовать map, когда вам нужно получить элементы по диапазону, так как они отсортированы, и вы можете просто перебирать их от одной границы к другой.

0 голосов
/ 03 сентября 2016

From: http://www.cplusplus.com/reference/map/map/

"Внутренне элементы в карте всегда сортируются по ее ключу в соответствии с определенным критерием строгого слабого порядка, указанным его внутренним объектом сравнения (типа Compare).

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

...