A hash_map
является более старой, нестандартной версией того, что для целей стандартизации называется unordered_map
(первоначально в TR1 и включено в стандарт начиная с C ++ 11). Как следует из названия, он отличается от std::map
в основном неупорядоченным - если, например, вы перебираете карту с begin()
до end()
, вы получаете элементы в порядке по ключу 1, но если вы перебираете unordered_map
с begin()
до end()
, вы получаете элементы в более или менее произвольном порядке.
Обычно unordered_map
обычно имеет постоянную сложность. То есть вставка, поиск и т. Д. Обычно занимают фиксированное количество времени, независимо от того, сколько элементов в таблице. std::map
имеет сложность, которая логарифмируется по количеству сохраняемых элементов - что означает, что время для вставки или извлечения элемента увеличивается, но довольно медленно , когда карта увеличивается. Например, если для поиска одного из 1 миллиона элементов требуется 1 микросекунда, то можно ожидать, что для поиска одного из 2 миллионов элементов потребуется около 2 микросекунд, 3 микросекунды для одного из 4 миллионов элементов, 4 микросекунды для одного из 8 миллионов. предметы и т. д.
С практической точки зрения, это еще не вся история. По своей природе простая хеш-таблица имеет фиксированный размер. Адаптировать его к требованиям переменного размера для контейнера общего назначения несколько нетривиально. В результате операции, которые (потенциально) увеличивают таблицу (например, вставка), потенциально относительно медленны (то есть большинство являются довольно быстрыми, но периодически одна будет намного медленнее). Поиск, который не может изменить размер таблицы, как правило, намного быстрее. В результате большинство таблиц на основе хеш-функции имеют тенденцию работать лучше, когда вы выполняете много поисков по сравнению с количеством вставок. В ситуациях, когда вы вставляете много данных, затем просматриваете таблицу один раз, чтобы получить результаты (например, подсчитав количество уникальных слов в файле), есть вероятность, что std::map
будет таким же быстрым и, возможно, даже более быстрым (но, опять же, сложность вычислений различна, поэтому она также может зависеть от количества уникальных слов в файле).
1 Где порядок определяется третьим параметром шаблона при создании карты, std::less<T>
по умолчанию.