Для моего последнего задания мне нужно создать хэш-таблицу, в которой хранятся акции, которые заключены в класс. Чтобы избежать столкновений, мне нужно использовать линейное зондирование. Однако проблема, с которой я столкнулся; что я не могу проверить, является ли элемент массива (который является хэш-таблицей) пустым.
Здесь некоторый код агрегирован из нескольких файлов, но это только для того, чтобы дать вам представление о том, что происходит.
class Stock{
friend class HashMap
}
class HashMap{
bool get() //this function is used for putting new stocks into the table
private:
struct Slot {
Stock slotStock;
}
Slot *slots;
}
В функции get()
while(slots[index] != NULL)
Это дает ошибку: никакой оператор "! =" Не соответствует этим операндам HashMap :: Slot! = Int
Какой альтернативный способ был бы для меня проверить, нет ли слота?
Массив распределяется динамически.
EDIT: Когда я инициализирую массив, использует ли он конструктор по умолчанию для создания объекта для каждого элемента массива или же он оставляет элементы пустыми?
Если у вас есть массив объектов типа X
, ни один из слотов не будет "пустым". Все они содержат объект типа X
Чтобы представлять пустой объект, это должно быть возможное состояние типа, которое хранится в массиве. Например, у вас может быть boost::optional<Slot>
или std::unique_ptr<Slot>
. В противном случае вы можете закодировать состояние непосредственно в свой Slot
класс (например, с членом bool).
Что вы хотите сделать, так это хранить массив указателей запаса, в то время как в настоящее время вы храните массив объектов Slot. Чтобы сделать вещи еще проще для вас, вы можете использовать вектор для хранения указателей.
Ваша структура данных резервного копирования будет выглядеть так:
std::vector< Stock* > vecStocks;
Каждый элемент в векторе является "слотом", и вам не нужен ваш слот-класс, если вы не собираетесь хранить некоторые метаданные о запасе.
Чтобы проверить, есть ли у вас запас в любом слоте вектора, вы сравниваете векторный элемент с NULL следующим образом:
if (vecStocks[index] == NULL)
Этот подход имеет положительный побочный эффект: вам не нужно выделять X-количество фондовых объектов спереди, где X - размер вашего хэш-карты (возможно, очень большое число, в зависимости от того, как часто вы сталкиваетесь).