初始化类定义中的结构数组

Initializing an array of structs within a class definition

本文关键字:结构 数组 定义 初始化      更新时间:2023-10-16

我有一个结构可以为BST创建这样的节点

struct BSTNode{
int data;
BSTNode *left;
BSTNode *right;
};

我需要在类中创建这些根节点的数组

class HashBST{
public:
bool lookup(int);
void insert(int);
bool remove(int);
float getLoad();
//private:
int hash(int);
BSTNode *table[1019];
float load;
int occupied = 0;
int tableSize = 1019;
};

从那里我希望能够检查并查看 BST 节点是否有条目。最初我尝试在结构定义中将dataint 设置为 -1,但在类中的数组中,每个节点都有一个垃圾数据值。

有没有办法将所有数据值设置为 -1,或者更理想的情况是,将table数组中的所有指针设置为NULL,直到其中存储某些内容?

有没有办法将所有数据值设置为 -1,

没有,因为节点的设计意味着哈希表的特定设计。由于您有节点,这意味着您使用单独的链接来解决哈希表冲突。

这意味着您的存储桶数组table需要使用空指针进行初始化,否则它包含不确定的值:

BSTNode* table[1019] = {}; // Zero-initialize buckets.

然后lookup成员函数将如下所示:

bool HashBST::lookup(int value) {
unsigned value_hash = hash(value); // Hash must be an unsigned value.
unsigned index = value_hash % tableSize;
for(BSTNode* node = table[index]; node; node = node->right) {
if(node->data == value)
return true;
}
return false;
}

在更高级的版本中,存储桶表应该只是一个指针BSTNode* table;它使用new[]的结果进行初始化,并且引用表的大小为tableSize

以下是我以C++友好的方式执行此操作的方法:

首先,将table转换为std::vector

std::vector<BSTNode*> table

HashBst创建一个构造函数,该构造函数使用所有 nullptr 值初始化std::vector<T*>

HashBST() : table(1019) {} //table items are all nullptr