Как проверить, пуст ли элемент массива классов? [C ++]

0

Для моего последнего задания мне нужно создать хэш-таблицу, в которой хранятся акции, которые заключены в класс. Чтобы избежать столкновений, мне нужно использовать линейное зондирование. Однако проблема, с которой я столкнулся; что я не могу проверить, является ли элемент массива (который является хэш-таблицей) пустым.

Здесь некоторый код агрегирован из нескольких файлов, но это только для того, чтобы дать вам представление о том, что происходит.

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: Когда я инициализирую массив, использует ли он конструктор по умолчанию для создания объекта для каждого элемента массива или же он оставляет элементы пустыми?

  • 0
    Объекты C ++ не имеют понятия пустого, как ссылки на Java.
  • 0
    Вы можете иметь флаг для каждого слота, независимо от того, действителен он или нет. Даже если он недействителен, объект слота все равно будет существовать, хотя, возможно, не в полезном состоянии.
Теги:
class
arrays
hashmap
hashtable

2 ответа

2

Если у вас есть массив объектов типа X, ни один из слотов не будет "пустым". Все они содержат объект типа X Чтобы представлять пустой объект, это должно быть возможное состояние типа, которое хранится в массиве. Например, у вас может быть boost::optional<Slot> или std::unique_ptr<Slot>. В противном случае вы можете закодировать состояние непосредственно в свой Slot класс (например, с членом bool).

  • 0
    Хорошо спасибо. Итак, когда массив выделяется динамически, он создает объект для каждого элемента, используя конструктор по умолчанию?
  • 0
    @FutureShocked: да.
Показать ещё 1 комментарий
0

Что вы хотите сделать, так это хранить массив указателей запаса, в то время как в настоящее время вы храните массив объектов Slot. Чтобы сделать вещи еще проще для вас, вы можете использовать вектор для хранения указателей.

Ваша структура данных резервного копирования будет выглядеть так:

std::vector< Stock* > vecStocks;

Каждый элемент в векторе является "слотом", и вам не нужен ваш слот-класс, если вы не собираетесь хранить некоторые метаданные о запасе.

Чтобы проверить, есть ли у вас запас в любом слоте вектора, вы сравниваете векторный элемент с NULL следующим образом:

if (vecStocks[index] == NULL)

Этот подход имеет положительный побочный эффект: вам не нужно выделять X-количество фондовых объектов спереди, где X - размер вашего хэш-карты (возможно, очень большое число, в зависимости от того, как часто вы сталкиваетесь).

  • 0
    Где будут храниться слоты, указанные в vecSlots?
  • 0
    @NeilKirk Вектор просто держит указатели на объекты в куче. Создатель хэш-карты обычно заставляет общедоступный интерфейс принимать указатели объектов для вставки карты, что возлагает ответственность на вызывающую сторону для управления объектами в куче (создания их и в какой-то момент их уничтожения).
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню