Ссылка и вставка в вектор списка <nodes> - PullRequest
0 голосов
/ 16 ноября 2018

Я использую хеш-таблицу и у меня возникли проблемы с реализацией.После буквальных часов поисков в этом вопросе я сдался и надеялся увидеть, что мне здесь помогут.Самая большая проблема связана с использованием векторов в HashTable (для меня это не имеет смысла, достаточно просто использовать список <>, но использовать его необходимо)

Моя главная проблема заключается в том, как реализоватьвставить функцию для добавления в HashTable.

void HashTable::insert(ulint key,ulint value){  //insert data associated with key

   HashNode nodeToAdd;
   nodeToAdd.assign(key, value);

   int index = hash_function(key);

   this->table[index].push_back(nodeToAdd);

   }

Теперь проблема, с которой я сталкиваюсь, заключается в добавлении HashNode в мой HashTable.

для ссылки в HashTable, поле для таблицы -

typedef vector <list<HashNode> > Table;
Table *table;

Итак, насколько я понимаю,

   this->table[index].push_back(nodeToAdd);

идет к вектору HashTable [index], который по индексу должен быть списком.и когда он попадает в этот список, он должен отправить новый узел в список.

1 Ответ

0 голосов
/ 16 ноября 2018

В вашем списке хранятся объекты типа HashNode, , а не , типа HashNode*.

Таким образом, вам нужно решить, какой из них вы хотите использовать, и соответствующим образом изменить код.

  1. Если вы хотите сохранить HashNode, тогда ваш insert неправильный - вместо этого он должен создать узел в стеке и сохранить его по значению в списке.

  2. Если вы хотите сохранить указатель, значит, ваш тип Table неправильный, и вместо него должен быть vector<list<HashNode*>> - обратите внимание, что с ним следует обращаться осторожно, поскольку указатели не будут автоматическиудалено.

Лично я бы посоветовал вам перейти с № 1 и избавить себя от множества головных болей.Но если вы настаиваете на # 2, то я предлагаю вам прекратить использовать malloc и использовать new - или еще лучше - std::unique_ptr или std::shared_ptr для автоматического управления временем жизни.

Также заслуживает внимания вашопределение Table *table.Это сбивает с толку, так как Table является вектором.Ваша функция insert разыменовывает этот указатель, ожидая, что он, возможно, будет указывать на массив значений Table, когда совершенно ясно, что вы на самом деле думаете, что это вектор.Я почти уверен, что вы не хотите, чтобы это был указатель.

Так как я только что заметил эту деталь, я думаю, что это первый источник вашей ошибки, начиная с table[index]на самом деле тип Table, а не тип list<HashNode>, и вы пытались вызвать несуществующую функцию vector<list<HashNode>>::push_back(HashNode*).

...