Hashtable в C++?

Я обычно использую карту stdlib C++ всякий раз, когда мне нужно сохранить некоторые данные, связанные с определенным типом значения (значение ключа - например, строка или другой объект). Реализация карты stdlib основана на деревьях, которые обеспечивают лучшую производительность (O (log n)), чем стандартный массив или вектор stdlib.

Мои вопросы: знаете ли вы о какой-либо «стандартной» реализации хеш-таблицы C++, которая обеспечивает еще лучшую производительность (O (1))? Нечто похожее на то, что доступно в классе Hashtable из Java API.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
56
0
54 319
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

См. std :: hash_map от SGI.

Он также включен в дистрибутив STLPort.

Он может быть включен в STLPort, но все же не является «стандартным», как хотелось бы спросить. Не существует класса стандарт с именем hash_map; вместо этого он называется unordered_map и находится в TR1.

Chris Jester-Young 25.09.2008 18:21
Ответ принят как подходящий

Если вы используете C++ 11, у вас есть доступ к заголовкам <unordered_map> и <unordered_set>. Они предоставляют классы std::unordered_map и std::unordered_set.

Если вы используете C++ 03 с TR1, у вас есть доступ к классам std::tr1::unordered_map и std::tr1::unordered_set с использованием тех же заголовков (если вы не используете GCC, и в этом случае вместо заголовков будут <tr1/unordered_map> и <tr1/unordered_set>).

Во всех случаях также есть соответствующие типы unordered_multimap и unordered_multiset.

В GCC вместо этого вы должны использовать имена заголовков <tr1 / unordered_map> и <tr1 / unordered_set>. Это причуда GCC. :-)

Chris Jester-Young 25.09.2008 18:24

Пакет функций VS2008 был заменен пакетом обновления 1 (SP1).

Ferruccio 25.09.2008 18:42

IIRC, реализации VC9 Feature Pack и SP1 tr1 :: unordered_map * поставлялись с примечаниями к выпуску, предупреждающими о неоптимальной производительности. Я предполагаю, что со временем это будет исправлено.

jwfearn 25.09.2008 19:22

Спасибо, Ферруччо! Я включил ваше исправление. (Прошу прощения за неправильное написание вашего имени в комментарии к редактированию, но я не верю, что теперь у меня есть способ исправить это.)

Chris Jester-Young 26.09.2008 02:40

Существует объект hash_map, о котором многие здесь упоминали, но он не является частью stl. Это расширение SGI, поэтому, если вы что-то искали в STL, я думаю, вам не повезло.

Visual Studio имеет класс stdext::hash_map в заголовке <hash_map>, а gcc имеет класс __gnu_cxx::hash_map в том же заголовке.

Если у них одинаковый интерфейс, довольно легко создать реализацию, поддерживающую их обоих, используя псевдонимы пространства имен и некоторую работу препроцессора.

Jasper Bekkers 25.03.2009 18:31

Я знаю, я знаю, что это устаревший материал. Не каждого коллегу можно убедить перейти на VS 2008 или установить Boost. Вот хороший трюк, как собрать их вместе: `namespace std {#ifdef GNUC using namespace __gnu_cxx; #elif using namespace stdext; #endif} `

ypnos 03.03.2010 18:50

hash_map также поддерживается в GNU libstdC++.

Dinkumware также поддерживает this, что означает, что многие реализации будут иметь hash_map (я думаю, что даже Visual C++ поставляется с Dinkumware).

Возможно, он широко поддерживается, но он не является «стандартным», как просил спрашивающий. Стандартными можно считать только объекты TR1.

Chris Jester-Young 25.09.2008 18:23

Я хотел сказать, что если все поставщики компиляторов поддерживают его (или поставщики stdlibC++, в зависимости от обстоятельств), то он может быть достаточно хорошей заменой «стандарту». Кстати, TR1 еще не "стандартный". Это принято для следующего стандарта, которого достаточно, чтобы продавцы реализовали его (моя точка зрения ...)

Ben Collins 25.09.2008 19:56

Думаю, это только для libstdC++ версии> = 4.0?

rogerdpack 07.12.2009 22:04

Если у вас еще нет unordered_map или unordered_set, они являются частью способствовать росту.
Вот документация для обоих.

Ура для Boost, снова предоставляющего максимальная переносимость. :-) См. Другой пример этого в stackoverflow.com/questions/131445.

Chris Jester-Young 26.09.2008 02:43

Если у вас есть расширения TR1, доступные для вашего компилятора, используйте их. Если нет, то у boost.org есть версия, которая очень похожа, за исключением пространства имен std ::. В этом случае добавьте объявление using, чтобы вы могли позже переключиться на std ::.

std :: tr1 :: unordered_map в <unordered_map>

если у вас нет tr1, получите ускорение и используйте boost :: unordered_map в <boost/unordered_map.hpp>

Другие вопросы по теме