Каково различие между контейнером std:: map и std:: unorderedmap

Каково различие между этими контейнеры STL std:: map и std:: unorderedmap, кроме того во время искания элемента, который работоспособнее.

1
задан 13.01.2017, 17:41
0 ответов

Оба с ассоциативными контейнерами; они присоединяют стоимость, T, с определенным ключевым словом, Key. В других языках они названы словарями или картами.

std::map< Key, T, Compare, Allocator >

Элементы хранятся продолжая определенный порядок: определенный параметром Compare шаблона. Они пробегаются в этом же самом порядке.

У операций поисков, уничтожения и вставления есть логарифмическая комплексность O (log n).

А именно, время, которое медлят с тем, чтобы реализовывать эти операции, зависит от количества элементов вmap. Все больше элементы, более медленный.

std::unordered_map< Key, T, Hash, KeyEqual, Allocator >

Элементы хранятся без порядка в особенности, используя для этого функцию hash или подписи (wikipedia). Почти невозможно пробегать их ни в каком типе команды, будучи этим случайный и зависимый от функции hash использованная.

У операций поисков, вставления и уничтожения есть, среднего показателя, постоянная комплексность O (1).

А именно, время, которое медлят с тем, чтобы реализовывать операции, - независимое от числа элементов; они опаздывают приблизительно то же самое существовало 1, 10, или 10000 элементов.

Здесь, стандарт, если он показывает, что они осуществляются посредством buckets (прощение из-за термина, я не нашел слово, приведенное в соответствие на Испанце. Wikipedia на английском).

Эти buckets ответственные лица за это приближение во временах.

Наблюдения

  • Учти, что эти указания - минимальные требования. А именно, ты можешь находить осуществления std::unordered_map что были быстрее, чем он показывает стандарт, когда могут становиться равным быстрых, что std::map. Он не происходит так с std::map. Дело не в том, что estardar этому воспрепятствовал, дело в том, что не возможно это делать более быстрым O (1).

  • Учти также, что показывает себе комплексность операции, а не времена. Смоги быть, хотя неправдоподобный, что один std::map с небольшим количеством элементов будьте быстрее, чем один std::unordered_map.

  • Играя с добавочными аргументами, возможно настраивать поведение. Например, в случае std::unordered_map, возможно пробегать их в конкретном порядке, хотя это сложно. Для этого, возможно использовать функцию hash персонализированная.

2
ответ дан 03.12.2019, 17:41

Чтобы не повторять прокомментированное из-за травмы...

std::map осуществи дерево узлов, которое является упорядоченным. Глубина различных ветвей склоняется к тому, чтобы быть тем же самым то, что вынуждает повторно размещать узлы во многих вставлениях. Ввиду этого эта карта предоставляет очень хорошие времена доступа, но наказывает непомерно вставление новой стоимости. Рекомендуйся для очень стабильных карт с большим числом консультаций.

std::unordered_map используй концепцию hash, чтобы группировать различные ключи. Этот механизм позволяет вводить элементы достаточно быстрой формы вместо того чтобы наказывать значительно поиски. Живые карты отрежь, или что получают вставления с усердием, обычно имеют лучшее время ответа с этим типом карты.

0
ответ дан 03.12.2019, 17:41