我是否正确设置此哈希表?

问题描述 投票:-1回答:1

我在数据结构课程中,我们得到了一个有关哈希表的项目。我得到的指示摘录如下:

哈希表是指向结构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_tablehash_table_entry类型的指针的数组,对吗?
  2. 当for循环遍历数组并创建新的hash_table_entry结构时,默认结构变量是否自动设置为“ Nil”?

预先感谢您提供任何见解!

c++ hashtable
1个回答
1
投票

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_entrynew hash_table_entry[hash_table_size](创建对象或类型为hash_table_entry的对象数组)都创建对象。因为这些表达式中没有给出初始化程序,所以对象是默认构造的。因为hash_table_entry没有任何用户声明/定义的构造函数,所以这意味着将使用隐式定义的默认构造函数。此构造函数确实对hash_table_entry的所有成员执行默认构造,这(因为它们是非类类型)意味着对它们不执行任何操作,因此,成员的值在初始化后将保留为[[indeterminate。 >

[这是否是分配Nil的含义值得怀疑。 Nil在C ++中不存在,因此我假设是NULLnullptr的意思,并且应该分配一个指针数组而不是对象,并使用空指针对其进行初始化。

指向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}

它还将为您初始化所有指针为空指针,不需要循环。
© www.soinside.com 2019 - 2024. All rights reserved.