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 и другими.