Мне нужно создать хэш-таблицу с ключом в виде строки и значением как int. Я не могу использовать контейнеры STL для своей цели. Есть ли подходящий класс таблицы хеш для этой цели?C++ хеш-таблица без использования STL
ответ
Вот быстрый грязный C-хэш, который я только что написал. Компилирует, но не проверяет локально. Тем не менее, идея заключается в том, чтобы вы могли работать с ней по мере необходимости. Выполнение этого полностью зависит от функции keyToHash. Моя версия не будет высокой производительности, но снова продемонстрирует, как это сделать.
static const int kMaxKeyLength = 31;
static const int kMaxKeyStringLength = kMaxKeyLength + 1;
struct HashEntry
{
int value;
char key[kMaxKeyLength];
};
static const char kEmptyHash[2] = "";
static const int kHashPowerofTwo = 10;
static const int kHashSize = 1 << kHashPowerofTwo;
static const int kHashMask = kHashSize - 1;
static const int kSmallPrimeNumber = 7;
static HashEntry hashTable[kHashSize];
int keyToHash(const char key[])
{
assert(strlen(key) < kMaxKeyLength);
int hashValue = 0;
for(int i=0; < strlen(key); i++)
{
hashValue += key[i];
}
return hashValue;
}
bool hashAdd(const char key[], const int value)
{
int hashValue = keyToHash(key);
int hashFullSentinal = 0;
while(strcmp(hashTable[hashValue & kHashMask].key, kEmptyHash))
{
hashValue += kSmallPrimeNumber;
if(hashFullSentinal++ >= (kHashSize - 1))
{
return false;
}
}
strcpy(hashTable[hashValue & kHashMask].key, key);
hashTable[hashValue & kHashMask].value = value;
return true;
}
bool hashFind(const char key[], int *value)
{
int hashValue = keyToHash(key);
while(strcmp(hashTable[hashValue & kHashMask].key, kEmptyHash))
{
if(!strcmp(hashTable[hashValue & kHashMask].key, key))
{
*value = hashTable[hashValue & kHashMask].value;
return true;
}
}
return false;
}
bool hashRemove(const char key[])
{
int hashValue = keyToHash(key);
while(strcmp(hashTable[hashValue & kHashMask].key, kEmptyHash))
{
if(!strcmp(hashTable[hashValue & kHashMask].key, key))
{
hashTable[hashValue & kHashMask].value = 0;
hashTable[hashValue & kHashMask].key[0] = 0;
return true;
}
}
return false;
}
Вы можете использовать unordered associative container от Boost, он же. boost::unordered_map
, который - это, реализованный в терминах хеш-таблицы.
хотя было бы интересно, какова оппозиция плаката к STL. Если это факт, что шаблоны используются, то форсирование также не работает. –
@mjmarsh: Правда, но в этом случае гораздо больше информации было бы полезно. Даже исключая STL - это необоснованный запрос, насколько мне известно, но поскольку никаких других ограничений не упоминалось, я думаю, что использование библиотек Boost, вероятно, является очевидным выбором. –
Это спорный вопрос, поскольку STL не имеет контейнера для хеш-таблиц; std :: map будет альтернативой. Для большинства целей нет оснований не использовать std :: map. Для использования, для которого требуется хэш-таблица, boost :: unordered_map - лучший выбор (и я думаю, что соответствует хеш-таблице, определенной в новом стандарте C++ TR1. Некоторые компиляторы, но я не могу назвать их, могут предоставить хэш-таблицу TR1 как станд :: tr1 :: unordered_map
вы можете проверить GLIB хэш-таблицы
http://library.gnome.org/devel/glib/stable/glib-Hash-Tables.html
в случае, если вы знаете свой список ключей раньше времени (или его надстройкой), вы можете использовать a perfect hash function генератор, такой как gperf
. gperf
будет выплюнуть код C или C++.
(Вы можете чтобы выполнить некоторую работу, чтобы фактически создать контейнер, учитывая хеш-функцию.)
Если вам нужна максимальная производительность, используйте MCT's closed_hash_map
или Google's dense_hash_map
. Первый проще в использовании, последний более зрелый. Ваш случай использования звучит так, как будто это выиграет от закрытого хэширования.
- 1. Как реализовать структуру данных словаря на C++ без использования STL
- 2. Напишите случайную функцию без использования функций stl
- 3. напечатайте и подсчитайте количество перестановок (без использования stl next_permutation)
- 4. Невозможно сгенерировать файлы тегов STL STL для использования vim
- 5. Причина отказа от использования STL?
- 6. C++ изменить размер указателя без STL (вектор ...)
- 7. Динамический массив C++, push_back без STL
- 8. C++ STL-совместимые распределители
- 9. C эквивалент STL C++
- 10. STL, уменьшая массив, C++
- 11. Ищите вектор C++ STL внутри вектора STL
- 12. Какова стратегия использования для сжимания вектора в C++ stl динамически?
- 13. Каков правильный способ использования итераторов C++ stl вместо традиционных указателей?
- 14. Объединение двух строковых массивов без использования STL или векторов в C++
- 15. Каков наилучший способ хранения и создания экземпляров классов на C++ без использования STL?
- 16. Как хранить комплексное число в массиве символов в C++ без использования std :: string, ни STL?
- 17. STL + Упорядоченный набор + без дубликатов
- 18. Обработка ошибок STL без исключений
- 19. C++ STL вектор резерв
- 20. C++ UNICODE и STL
- 21. C++ Templated STL Container
- 22. STL карта и C++
- 23. Контейнеры в STL C++
- 24. Подмножество вектора/C++/STL
- 25. C++ - STL vector question
- 26. Преобразование C++ STL
- 27. STL в C++
- 28. C++ - алгоритм Kruskal STL
- 29. STL проблема список C
- 30. C++ STL контейнеры
Что вы можете * использовать * Вы ищете советы по реализации хеш-таблицы или альтернативных существующих реализаций? –
Вам лучше иметь впечатляюще вескую причину, чтобы не использовать STL. Возможно, это домашнее задание? – AshleysBrain
Слово target подразумевает для меня какую-то встроенную систему. –