【问题标题】:Am I Setting up this Hash Table Correctly?我是否正确设置了这个哈希表?
【发布时间】:2019-10-19 02:42:02
【问题描述】:

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

哈希表是一个指向结构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++(从使用 new 可以看出),您应该使用 std::vector 而不是手动动态内存分配 new。在 C++ 中没有值 Nil。你的意思是NULL 还是nullptr?你还没有展示hash_table_entry的定义,所以new hash_table_entry;是如何初始化的这个问题无法回答。而hash_tablehash_table_entry 的数组,而不是hash_table_entry*(指向hash_table_entry 的指针)。
  • @uneven_mark 我很想使用向量,但不幸的是,该项目的指导方针是我们只能使用 iostream、string 和 fstream 库。如果 C++ 中没有 NIL,我的意思一定是 NULL,老实说,在这个任务之前我从未听说过 NIL。我已经编辑了原始问题以包含“hash_table_entry”的定义
  • 1.不,这不对; 2. 如果您真的尝试编译显示的代码,这甚至不会编译,正如您自己应该发现的那样。
  • @SamVarshavchik 感谢您的洞察力。我在 Notepad++ 中编写此代码并通过 SSH 使用 makefile 进行编译,因此在我的本地环境中没有编译器检查。如何使“hash_table”成为“hash_table_entry”指针数组?
  • @rclever2 您是说在编写代码时无法随时编译和运行代码吗?这不是一种可行的编程方式。在您的机器(GCC、Clang、MinGW 等)和 IDE 上安装任何 C++ 编译器,并在代码更改后使用它定期重新编译和测试。即使像使用godbolt.org 这样的东西也比根本无法编译代码要好。

标签: c++ hashtable


【解决方案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”?

如 cmets 中所述,作业

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 的所有成员的默认构造,这(因为它们是非类类型)意味着对它们不做任何事情,因此成员的值将在之后保持不确定初始化。

这是否是 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}

它还会为你初始化所有指向空指针的指针,不需要循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    相关资源
    最近更新 更多