Каково различие между набором и hashset в C++ STL?

Когда я должен выбрать один по другому? Есть ли какие-либо указатели, которые Вы рекомендовали бы для использования правильных контейнеров STL?

24
задан gsamaras 23 April 2016 в 17:10
поделиться

5 ответов

hash_set - это расширение, не являющееся частью стандарта C ++. Поиск должен быть O (1), а не O (log n) для набора , поэтому в большинстве случаев это будет быстрее.

Еще одно отличие будет видно при итерации по контейнерам. set доставит содержимое в отсортированном порядке, а hash_set будет по существу случайным (спасибо Лу Франко).

Редактировать: В обновлении C ++ 11 до стандарта C ++ был введен unordered_set , который следует использовать вместо hash_set . Производительность будет аналогичной и гарантирована стандартом. «Неупорядоченный» в названии подчеркивает, что его повторение не приведет к результатам в произвольном порядке.

33
ответ дан 28 November 2019 в 23:04
поделиться

Еще одна вещь, о которой следует помнить, - это то, что с hash_set вы должны предоставить хеш-функцию, тогда как set требует только функцию сравнения ('<'), которую легче определить (и предопределено для собственных типов).

3
ответ дан 28 November 2019 в 23:04
поделиться

stl :: set реализовано как двоичное дерево поиска. hashset реализовано как хэш стол.

Основная проблема здесь в том, что многие люди используют stl :: set , думая, что это хеш-таблица с поиском O (1), чего нет и нет. У него действительно есть O (log (n)) для поиска. Помимо этого, прочтите о двоичных деревьях и хэш-таблицах, чтобы лучше понять структуры данных.

15
ответ дан 28 November 2019 в 23:04
поделиться

Я не думаю, что кто-то ответил на другую часть вопроса.

Причиной использования hash_set или unordered_set является обычно O(1) время поиска. Я говорю "обычно", потому что время от времени, в зависимости от реализации, хэш может быть скопирован в более крупный хэш-массив, или хэш-ведро может содержать тысячи записей.

Причина использовать набор - если вам часто нужен самый большой или самый маленький член набора. Хэш-массив не имеет порядка, поэтому нет быстрого способа найти наименьший элемент. Дерево имеет порядок, поэтому найти наибольший или наименьший элемент можно очень быстро. O(log n) для простого дерева, O(1), если оно содержит указатели на концы.

1
ответ дан 28 November 2019 в 23:04
поделиться

Набор hash_set может быть реализован с помощью хеш-таблицы, которая содержит в основном O (1) операций, тогда как набор реализуется каким-либо деревом (AVL, красно-черный и т. Д.) С O (log n) операций. , но находятся в отсортированном порядке.

Edit: Я написал, что деревья O (n). Это совершенно неверно.

1
ответ дан 28 November 2019 в 23:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: