Быстрый доступ к элементу требует определенной формы заказа. Unordered_map
называется так, потому что порядок может не иметь смысла для человека и может не оставаться стабильным при добавлении или удалении элементов.
unordered_map
не быстрее, чем map
, потому что сравнение хэшей один в один быстрее, чем сравнение произвольных объектов один в один. Это быстрее, потому что это не нуждается в сравнении вообще. Вот почему ему не нужен compare
параметр шаблона.
Типичная реализация unordered_map
- это хеш-таблица. Хеш-таблица - это в основном обычный массив пар ключ-значение, который использует хитрый трюк, чтобы помочь вам быстро найти элемент, который вы ищете.
Идеальная хеш-функция распределена равномерно: если вы выбираете хеш из любого случайного объекта, значение hash % N
для некоторого целого числа N должно быть примерно одинаковым (делая вид, что на секунду по модулю смещения *) 1014 * не существует). Если вы выбираете N
в качестве размера вашего массива пар ключ-значение, вы можете использовать hash(key) % size
в качестве индекса массива для быстрого поиска.
Поскольку предполагается, что значение хеш-функции должно быть равномерно распределено, разные объекты обычно будут иметь разные индексы, поэтому обычно все будет работать в вашу пользу. Тем не менее, все еще возможно, что hash(key) % N
это то же самое для двух объектов. В этом случае хеш-таблица должна обрабатывать коллизии: существует несколько стратегий, но все они обычно переходят к линейному поиску по ключам, попавшим в одно и то же хеш-хранилище (и по этой причине хеш-таблица должна также содержать ключ, а не только хеш-ключ). Вот почему наихудшее время доступа к хеш-таблице составляет O (n), и это подчеркивает важность наличия хорошей хеш-функции.
В некоторых случаях это может быть причиной для предпочтения map
над unordered_map
, поскольку производительность доступа map
(O (log n)) очень предсказуема.
Кроме того, по мере того, как увеличивается число занятых сегментов в хэш-таблице, также увеличивается вероятность столкновения. В общем, по этой причине хеш-таблицы будут иметь больше сегментов, чем элементов, а это означает, что они «тратят» пространство на эффективность.