C++ C++;-检查指针数组中的指针是否已为;“填写”;
我正在为我的大学做一个项目,在那里我必须实现一个哈希表。我对C++很陌生,所以请原谅我,如果我不够具体,或者我完全错误的假设。 Soo..我的主要问题是我有一个所谓的“Bucket”,它是我程序中的一个结构,包含一个N个(模板参数)位置的指针数组 例如,在名为my_Set的主类中,我有一个额外的Bucket*表[1]< 我的第一个假设是将kptr数组初始化为nullptr,然后在insert方法中C++ C++;-检查指针数组中的指针是否已为;“填写”;,c++,arrays,c++11,pointers,null-pointer,C++,Arrays,C++11,Pointers,Null Pointer,我正在为我的大学做一个项目,在那里我必须实现一个哈希表。我对C++很陌生,所以请原谅我,如果我不够具体,或者我完全错误的假设。 Soo..我的主要问题是我有一个所谓的“Bucket”,它是我程序中的一个结构,包含一个N个(模板参数)位置的指针数组 例如,在名为my_Set的主类中,我有一个额外的Bucket*表[1]< 我的第一个假设是将kptr数组初始化为nullptr,然后在insert方法中 void insert(Bucket &bkt, T &key) { fo
void insert(Bucket &bkt, T &key) {
for (int i=0; i<N, ++i) {
if (bkt.kptr[i]) { //Check on nullptr!
kptr[i] = key;
}
}
}
void insert(桶和桶、T和键){
对于(int i=0;i
检查指针数组中的指针是否已“填充”
…那么,是否有其他有效的方法来检查数组的单个字段是否已分配给对象
是:初始化指向nullptr的指针。然后,如果指针的值不是nullptr,则您知道它已指向一个对象
然而,你的教授是正确的,你的检查效率很低。在每次插入时,你都会遍历所有以前插入的对象
这是不必要的。您可以通过记住下一个自由指针的位置来避免检查是否分配了任何指针。我们如何在算法中“记住”事情?回答:使用变量。因为您必须记住容器的每个实例,所以您需要一个成员变量
既然您使用这个新变量来记住下一个自由指针,那么我们将它命名为next\u 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 < /代码>,那么您将有另一个标准容器来重新实现。因此,考虑效率是否值得额外的工作。< /P>不要使用新的和删除,使用STD::ad。它使您的代码更可读,更抗bug,更易于调试。此外,对于表,我总是更喜欢dimX*dimY一维数组而不是二维数组。编辑:抱歉没有阅读重要注释;)
kptr
应该是一个T**
。它应该在构造函数中分配到足够的大小并清除。然后检查数组的一个成员是否是nullptr
@lars就很简单了:请参阅文章底部的重要说明。我肯定std::array
包含在其中。很遗憾,但有些老师坚持在正确的方法之前(甚至不是正确的方法之前)先教硬的方法。@StefanPadu:请编辑问题。不要在注释中进行更正。如果N
是一个模板参数(因此在编译时已知),为什么不将kptr
类型设置为t*kptr[N]
?这将删除一个级别的动态分配。好吧,这正是我想做的……但怎么做呢?据我所知,就像我在请求中实际提到的,我必须做一个T**kptr而不是T*kptr-但我的教授告诉我这是一个非有效的方法?!好的。是“非有效”吗一个问题?不幸的是,是的:/但无论如何,我想我会这么做,因为我无法想象有任何其他“更有效”的方法来这么做!使枚举状态{free,inuse}更无效,我想…非常感谢!!看起来已经很好了!但是我需要Bucket&因为我的表包含更多Bucket(参见我在主类中谈论Bucket*表的最初帖子)。@StefanPadu数组大小有限(N
).Justin Time建议您可以检查insert的调用方是否尝试插入超过N个
元素。您可以通过从next\u free
中减去kptr
来找到插入的元素数。
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
}