#c #pointers #struct #hashtable
#c #указатели #структура #хэш-таблица
Вопрос:
Я реализую хэш-таблицу, которая помогает хранить и извлекать свойства для приложения. На данный момент это в основном работает, за исключением случаев, когда я пытаюсь получить значение, которое не существует. Мой код должен возвращать пустую строку, вместо этого происходит сбой. Вот соответствующий код. Массив распределяется динамически.
struct Property {
Property* next;
std::string key;
std::string value;
Property() {
key = "";
value = "";
next=NULL;
}
};
Property* properties;
int propSize;
std::string Properties::getProperty(std::string key) {
Property *ptr = amp;properties[hashcode(key)%propSize];
if (properties[hashcode(key)%propSize].key == "") {
return "";
}
else {
while((ptr->key != key) amp;amp; (ptr->next != NULL))
ptr = ptr->next;
if (ptr->key != key)
return "";
else
return ptr->value;
}
}
Комментарии:
1. -1: Вы пытались это отладить? Что вы обнаружили?
2. C уже поставляется с профессионально разработанной хэш-таблицей в
<unordered_map>
(или<tr1/unordered_map>
, или<boost/unordered_map.hpp>
, или<ext/hash_map>
). Зачем создавать свои собственные, если цель не в том, чтобы научиться писать хэш-таблицу?3. Я попытался отладить его и ничего не получил. Все это просто остановилось в цикле while. 1. Я не знал о unordered_map 2. Мне нужно иметь возможность просматривать и сохранять все записи на карте.
Ответ №1:
Используйте одну из нескольких стандартных реализаций хэш-таблицы, например unordered_map
. Вы упомянули, что вам «нужно иметь возможность просматривать и сохранять все записи на карте»; тривиально перебирать карту и делать с элементами все, что вы хотите, например, используя std::copy()
.
Комментарии:
1. На данный момент ни одна из реализаций unordered_map не работает. Перейдя по ссылке , я получил сообщение об ошибке «‘tr1’ в пространстве имен ‘std’ не называет тип». С версией boost я получил ошибку с кодом в заголовке.