可扩展散列 - 析构函数 C++

Posted

技术标签:

【中文标题】可扩展散列 - 析构函数 C++【英文标题】:extendible hashing - destructor C++ 【发布时间】:2015-06-14 12:18:43 【问题描述】:

所以...我已经实现了一个扩展哈希的版本...我现在的问题是析构函数。

我在 Hash 类中使用了一组指针,这些指针指向 Bucket 类中的桶。问题是同一个桶上可以有多个指针。

在 Hash 类的析构函数中,我必须先删除每个存储桶,然后再删除数组,但我必须注意不要两次删除同一个存储桶(我认为这会导致错误)。为了做到这一点,我使用了一个布尔向量来记忆存储桶是否已经被删除。

我现在的问题是:有没有办法在不使用更多内存(布尔向量)的情况下知道存储桶是否已被删除?

LE:我使用 nullptr 解决了析构函数问题(现在似乎正在工作),但是......另一个问题:我怎样才能准确地遍历每个存储桶 1 次(例如,用于查找最小和最大元素)。这次我不能使用 nullptr(指针需要保持在原来的位置 - 在存储桶上)

【问题讨论】:

也许考虑使用std::shared_ptr?它使用每个对象 2-3 个字的内存加上共享状态,但它通常是简单性和安全性的良好折衷。 您在正常运行时遇到了同样的问题。所以,只需 shared_ptr 就可以了。 感谢您的快速回复...嗯,这是 uni 的项目,我真的不允许使用 std::shared_ptr... 【参考方案1】:

只需反复使用您的擦除功能

while (size ())

    erase(begin());

【讨论】:

这是什么意思?我有删除指针[i]; ...其中指针[i] 是指针之一。但是如果我删除它然后稍后(假设指针[j] where j > i)我必须再次删除它我不能(因为我已经删除它并且指针[j]指向不再存在的东西. 我只是想我应该删除存储桶,然后将该存储桶上显示的所有指针设置为指向 NULL。这是一个好主意吗?还有一个问题......我如何浏览(用谷歌翻译翻译......对不起,如果它是错误的动词:D)每个桶正好1次(例如,用于查找最小和最大元素) 在你写你的析构函数之前,它会删除所有的东西,想出一个擦除函数来删除一个【参考方案2】:

我在 Hash 类中使用了指向桶的指针数组 从类桶。问题是可以有多个指针 同一个桶。

我现在的问题是:有没有办法知道一个桶是否已经 在不使用更多内存的情况下被删除(布尔向量)?

当然——使用引用计数。在 Bucket 类中放入一个整数成员变量,初始化为零。每当您创建指向该 Bucket 对象的指针时,递增整数。每当您使指向 Bucket 的指针无效时(即,每当您对该指针调用 delete 时),递减整数成员变量。如果该减量导致整数变为零,则您知道 Bucket 没有更多指向它的指针,因此删除 Bucket。

【讨论】:

好主意...但使用 nullptr 似乎更容易:D...显然它正在工作

以上是关于可扩展散列 - 析构函数 C++的主要内容,如果未能解决你的问题,请参考以下文章

c++ 析构函数 是在啥时候执行

通过C++编译视频平台为什么要使用virtual虚析构函数?

重读STL源码剖析:析构

面试中常被问到C++析构函数,虚析构函数

为啥C++里面,析构函数会被调用两次

C++需要析构函数