Нашел этот хороший вопрос, который аналогичен, но не совсем так, поскольку он говорит о Java, который имеет различную реализацию хеш-таблиц, благодаря наличию синхронизированных аксессуаров/мутаторов Различия между HashMap и Hashtable?
Так в чем же разница в реализации С++ для set и unordered_set? Конечно, этот вопрос можно распространить на карту vs unordered_map и т.д. Для других контейнеров С++.
Вот моя первоначальная оценка
set. Хотя стандарт явно не требует, чтобы он был реализован как деревья, ограничение временной сложности, запрашиваемое для его операций для find/insert, означает, что он всегда будет реализован как дерево. Обычно это дерево RB (как видно из GCC 4.8), которое сбалансировано по высоте. Поскольку они сбалансированы по высоте, у них есть предсказуемая сложность времени для find()
Плюсы: Компактный (по сравнению с другими DS в сравнении)
Con: Сложность времени доступа - O (lg n)
unordered_set. Хотя стандарт явно не требует, чтобы он реализовывался как деревья, ограничение временной сложности, запрашиваемое для его операций для find/insert, означает, что он всегда будет реализован как хеш-таблица.
Плюсы:
- Быстрее (promises амортизируется O (1) для поиска)
- Легко конвертировать базовые примитивы в потокобезопасные, по сравнению с tree-DS
Минусы:
- Поиск не гарантируется O (1) Тройной худший случай - O (n)
- Не такой компактный, как дерево. (для практических целей коэффициенты нагрузки никогда не 1)
Примечание: O (1), для хэш-таблицы исходит из предположения, что нет столкновения. Даже с коэффициентом нагрузки 0,5 каждая вставка второй переменной приводит к столкновению. Можно заметить, что коэффициент нагрузки хэш-таблицы обратно пропорционален количеству операций, необходимых для доступа к элементу в нем. Больше мы уменьшаем # operations, более редкую хеш-таблицу. Когда сохраненный элемент имеет размер, сопоставимый с указателем, тогда накладные расходы довольно значительны.
Изменить: поскольку большинство из них говорит, что вопрос содержит в себе достаточный ответ, я меняю вопрос на "Я пропустил какую-либо разницу между картой/набором для анализа производительности, которую нужно знать?"