C получает свойство из хэш-таблицы с помощью цепочки

#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 я получил ошибку с кодом в заголовке.