Правильно ли я настраиваю эту хэш-таблицу? - PullRequest
0 голосов
/ 19 октября 2019

Я нахожусь в классе структур данных, и нам дан проект относительно хеш-таблиц. Выдержка из инструкций, которые мне дали:

Хеш-таблица представляет собой массив указателей на структуру hash_table_entry, все инициализированные на Nil.

Итак, это то, что я написал (опять же, выдержка из всей программы):

hash_table_entry *hash_table = new hash_table_entry[hash_table_size];
for (int i=0;i<hash_table_size;i++)
{
    hash_table[i] = new hash_table_entry;
}

hash_table_entry:

struct hash_table_entry{
char event_id; // Event id -- key used to hash on
int year; // Year of storm event
int event_index; // For the given year, the index into array of storm events };

Итак, у меня есть следующие вопросы:

  1. hash_table - это массив указателей типа hash_table_entry, верно?
  2. Когда цикл for проходит через массив и создает новую структуру hash_table_entry, автоматически устанавливаются переменные структуры по умолчаниюна "Nil"?

Заранее благодарим вас за понимание!

1 Ответ

0 голосов
/ 19 октября 2019

hash_table - массив указателей типа hash_table_entry, верно?

Нет, hash_table - это указатель на hash_table_entry, который после данной инициализациис new hash_table_entry[hash_table_size]; будет указывать на (первый элемент) массив из hash_table_entry (а не массив для указателя на hash_table_entry).

Когда цикл for проходит через массив и создает новую структуру hash_table_entry, для переменных структуры по умолчанию автоматически устанавливается значение "Nil"?

Как отмечено в комментариях, присваивание

hash_table[i] = new hash_table_entry;

не компилируется из-за несоответствия типов. hash_table[i] имеет тип hash_table_entry, в то время как new hash_table_entry имеет тип hash_table_entry*.

Но, за исключением вопроса инициализации: new hash_table_entry и new hash_table_entry[hash_table_size] (оба создают объекты или массивы объектовтипа hash_table_entry) создание объектов. Поскольку в этих выражениях не указан инициализатор, объекты создаются по умолчанию. Поскольку hash_table_entry не имеет никаких объявленных / определенных конструкторов, это означает, что будет использоваться неявно определенный конструктор по умолчанию. Этот конструктор выполняет конструкцию по умолчанию для всех членов hash_table_entry, что (поскольку они не являются типами классов) означает, что с ними ничего не сделано, и поэтому значения членов останутся неопределенными после инициализации.

Является ли это значением присвоения Nil, сомнительно. Nil - это не то, что существует в C ++, и поэтому я предполагаю, что подразумевается NULL или nullptr и что вы должны выделить массив указателей вместо объектов и инициализировать их нулевыми указателями.

Массив указателей на hash_table_entry выделяется с new hash_table_entry*[hash_table_size], что приводит к hash_table_entry**, а не hash_table_entry*. Если вы добавите {} как в:

new hash_table_entry*[hash_table_size]{}

или более явно

new hash_table_entry*[hash_table_size]{nullptr}

, это также инициализирует все указатели для нулевых указателей для вас, цикл не требуется.

...