我正在为我的大学开展一个项目,我必须实现一个哈希表。我对c ++很新,所以请原谅我,如果我不够具体,或者我有完全错误的假设。
Soo ..我的主要问题是我有一个所谓的“Bucket”,它是我程序中的一个结构,它包含一个N(模板参数)位置的指针数组。
struct Bucket {
T *kptr{ nullptr };
Bucket *bptr{ nullptr }; //For overflow chains (linear Hashing)
Bucket(Bucket *bptr = nullptr) : kptr(new value_type[N]),bptr(bptr) {}
~Bucket() { if(bptr) delete[] bptr; if (kptr) delete[] kptr; }
};
在我的名为My_Set的主类中,我有一个额外的Bucket *表[1<
我的第一个假设是将kptr数组初始化为nullptr,然后在insert方法中将其设置为
void insert(Bucket &bkt, T &key) {
for (int i=0; i<N, ++i) {
if (bkt.kptr[i]) { //Check on nullptr!
kptr[i] = key;
}
}
}
但这是不可能的,因为那时kptr应该是Bucket T ** kptr而不是Bucket * kptr,据我所知。 那么,如果已经将数组分配给一个对象,是否有任何其他有效的方法来检查数组的单个字段?
重要提示:我不允许使用STL容器,Smart Poitners和类似的东西,这会使整个事情变得更容易。 谢谢!
答案 0 :(得分:0)
检查指针数组中的指针是否已经“填充”
...那么,如果已经分配给一个对象,是否有任何其他有效方法来检查数组的单个字段?
是:初始化指向nullptr的指针。然后,如果指针的值不是nullptr,则表明它已被指向一个对象。
但是,您的教授检查效率低下是正确的。在每个插入中,您遍历所有先前插入的对象。
这是不必要的。您可以通过记住下一个空闲指针的位置来避免尝试检查是否已指定任何指针。我们怎样才能记住&#34;算法中的东西?答:使用变量。由于必须记住容器的每个实例,因此需要一个成员变量。
由于您使用此新变量来记住下一个空闲指针,我们如何命名它next_free
。现在,考虑到变量必须引用现有对象,它应该具有什么类型?引用将是一个很好的猜测,但是一旦插入元素,您还必须能够重新分配它。什么可以引用像引用的对象,但可以重新分配?答案:一个指针。由于这个指针指向一个指向T
的指针,它的类型应该是什么?答案:T**
。它应该被初始化为什么?答案:kptr
的第一个元素的地址。有了这样的成员,insert
可以像这样实现:
void insert(T &key) { // why would there be a Bucket argument for insert?
*next_free++ = new T(key); // Note: Do not do this in actual programs. Use
// RAII containers from the standard library instead
}
然后kptr应该是Bucket T ** kptr,而不是Bucket * kptr,据我所知。
正确。 T*
不能指向包含指针的数组(除非T
恰好是指针) - 它可以指向T
个对象的数组。 T**
可以指向T
的指针数组。
使用平面可调整大小的数组会更有效,而不是指向单独分配的对象。但由于您不允许使用std::vector
,因此您将有另一个标准容器重新实现。因此,请考虑效率是否值得额外的工作。