对于我的最新作业,我需要创建一个包含股票的哈希表,这些股票封装在一个类中。为避免碰撞,我需要使用线性探测。然而,我遇到的问题;是我无法测试数组的元素(哈希表)是否为空。
以下是从多个文件聚合的一些代码,但这只是为了让您了解正在发生的事情。
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
我可以用另一种方法检查一个插槽是否为空?
数组是动态分配的。
编辑:当我初始化数组时,是否使用默认构造函数为数组的每个元素创建一个对象,还是将元素留空?
答案 0 :(得分:2)
如果您有X
类型的对象数组,则没有任何插槽为“空”。它们都包含X
类型的对象。要表示空对象,它需要是存储在数组中的类型的可能状态。例如,您可以boost::optional<Slot>
或std::unique_ptr<Slot>
。否则,您可以将状态直接编码到Slot
类中(例如,使用bool成员)。
答案 1 :(得分:0)
您要做的是存储一组 Stock 指针,而您当前正在存储 Slot 对象的数组。为了使自己更容易,你可以使用向量来存储指针。
您的支持数据结构如下所示:
std::vector< Stock* > vecStocks;
向量中的每个项目都是&#34;插槽&#34;,除非您打算存储有关该股票的一些元数据,否则您不需要您的Slot类。
要检查向量的任何插槽中是否有库存,请将向量项目与NULL进行比较,如下所示:
if (vecStocks[index] == NULL)
这种方法具有积极的副作用,不需要预先分配X个Stock对象,其中X是你的hashmap的大小(可能是一个非常大的数字,取决于你想要碰撞的频率)。