【问题标题】:How do I check if an element of an array of classes is empty? [c++]如何检查类数组的元素是否为空? [c++]
【发布时间】:2015-01-13 20:39:28
【问题描述】:

对于我的最新任务,我需要创建一个包含股票的哈希表,这些股票被封装在一个类中。为了避免碰撞,我需要使用线性探测。但是,我遇到的问题;是我无法测试数组的元素(即哈希表)是否为空。

这里是从几个文件中汇总的一些代码,但这只是为了让您了解发生了什么。

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

我有什么替代方法可以检查插槽是否为空?

数组是动态分配的。

编辑:当我初始化数组时,它是使用默认构造函数为数组的每个元素创建一个对象,还是将元素留空?

【问题讨论】:

  • C++ 对象没有像 Java 引用那样的空概念。
  • 您可以为每个插槽设置一个标志,无论它是否有效。即使无效,插槽对象仍然存在,尽管可能不在有用状态。

标签: c++ arrays class hashmap hashtable


【解决方案1】:

如果您有一个X 类型的对象数组,则没有一个插槽是“空的”。它们都包含X 类型的对象。要表示一个空对象,它需要是存储在数组中的类型的可能状态。例如,您可以拥有boost::optional<Slot>std::unique_ptr<Slot>。否则,您可以将状态直接编码到您的 Slot 类中(例如,使用 bool 成员)。

【讨论】:

  • 好的,谢谢。那么当数组动态分配时,它使用默认构造函数为每个元素创建一个对象?
  • 如果您不想直接将标志添加到插槽对象,也可以使用std::pair<Slot, bool>
【解决方案2】:

您要做的是存储 Stock 指针数组,而您当前正在存储 Slot 对象数组。为了让自己更轻松,您可以使用向量来存储指针。

您的支持数据结构如下所示:

std::vector< Stock* > vecStocks;

向量中的每个项目都是一个“槽”,除非您打算存储有关股票的一些元数据,否则您不需要 Slot 类。

要检查向量的任何插槽中是否有库存,请将向量项与 NULL 进行比较,如下所示:

if (vecStocks[index] == NULL)

这种方法有一个积极的副作用,即不需要预先分配 X 个 Stock 对象,其中 X 是您的 hashmap 的大小(可能是一个非常大的数字,取决于您喜欢碰撞的频率)。

【讨论】:

  • @NeilKirk 该向量只是保存指向堆上对象的指针。哈希映射的编写者通常会让公共接口接受映射插入的对象指针,这使调用者有责任管理堆上的对象(创建它们,并在某些时候销毁它们)。
  • @NeilKirk 也许你的意思是 shared_ptr。 unique_ptr 不适用于此,因为它不可复制且没有意义(也不会编译)。存储为 shared_ptrs 的向量是可能的,但它要求 hashmap 的用户提供映射值作为 shared_ptrs。它还要求您使用 C++11 编译或使用 boost::shared_ptr 代替。如果您的程序已经在 shared_ptr 列车上,那么这是一个不错的选择。
  • std::vector&lt;std::unique_ptr&lt;Stock&gt;&gt; 会编译,这是一种常见的设计模式。也许你在想auto_ptr
  • @NeilKirk 对此进行了更多研究,您是对的,尽管它需要 C++11 中提供的 move 语义。当然,公共接口必须使用 unique_ptrs 接收数据。此外,似乎 get() 操作只能按值返回,因为您无法返回 unique_ptr 的副本,而且您当然不想移动它。尽管如此,到目前为止,我认为我们已经偏离了 OP 的问题。
猜你喜欢
  • 2019-05-14
  • 2013-07-20
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
相关资源
最近更新 更多