Std:: hash_set vs std:: unordered_set, они то же самое?
Я знаю, что hash_set
является нестандартным, а unordered_set
является стандартным. Тем не менее, я задаюсь вопросом, насколько эффективна работа, какая разница между ними? Почему они существуют отдельно?
Ответы
Ответ 1
Требования к сложности для unordered_
-контейнеров, установленных стандартом С++, по существу не оставляют много места для реализации, которая должна быть своего рода хэш-таблицей. Стандарт был полностью информирован о том, что эти структуры данных уже были развернуты большинством вендоров в качестве расширения.
Поставщики компиляторов обычно называют эти контейнеры "хеш-картой" или "хеш-набором", о чем вы, вероятно, имеете в виду (в стандарте нет литерала std::hash_set
, но я думаю, что там есть один в GCC в отдельное пространство имен и аналогично для других компиляторов).
Когда новый стандарт был написан, авторы хотели избежать возможной путаницы с существующими библиотеками расширений, поэтому они пошли на имя, которое отражает типичный менталитет С++: скажите, что это такое, а не как оно реализовано. Неупорядоченные контейнеры, ну, неупорядоченные. Это означает, что вы получаете меньше от них по сравнению с заказанными контейнерами, но эта уменьшенная утилита дает вам более эффективный доступ.
Реализация, hash_set, Boost-unordered, TR1-unordered и С++ 11-неупорядоченные будут очень похожи, если не идентичны.
Ответ 2
Относительно вопроса "они одно и то же" из строки темы: на основе моего опыта обновления кода с __gnu_cxx:: hash_set до std:: unordered_set, они почти, но не точно, то же самое.
Разница, с которой я столкнулся, заключается в том, что итерация через __gnu_cxx:: hash_set вернула элементы в том, что, казалось, было исходным порядком вставки, тогда как std:: unordered_set не будет. Таким образом, как следует из названия, нельзя полагаться на итератор, чтобы возвращать элементы в каком-либо конкретном порядке при повторении всего std:: unordered_set.
Ответ 3
Visual Studio 2010, например, имеет как hash_xxx
, так и unordered_xxx
, и если вы просматриваете заголовки, по крайней мере их реализация одинакова для всех тех же (те же базовые -/ "политики" -классы).
Для других компиляторов я не знаю, но из-за того, что хэш-контейнер обычно должен быть реализован, я думаю, что не будет много различий, если они вообще есть.
Ответ 4
Они почти такие же. Стандартное (С++ 0x) имя unordered_set. hash_set было более ранним именем из boost и другими.