2

我需要一个数据结构,我想在其中存储有关我在操作期间已经处理了哪些实例的信息。由于限制,我无法将其存储在实例本身中(例如,因为我可以并行执行操作。

具体而言,我要为其存储信息的实例具有唯一编号,因此我可以使用该唯一编号来存储信息,而不是指向该实例的指针。

我的第一个解决方案是使用std::set<Instance *>. 每次我处理一个实例时,我都会将它添加到集合中,这样我就知道我已经处理了那个实例。

  • 优点:初始化速度非常快
  • 缺点:查找不是O(1),而是O(logN)

我的第二个解决方案是使用一个std::vector<bool>(实际上是std::vector<byte>因为 bool 向量具有特定的专业化,这使得它比非 bool 向量慢)。实例的唯一编号可以用作向量中的索引,并且在向量中仅包含真或假来指示我们是否已经处理过该实例(幸运的是,我的唯一编号从 1 开始计数)。

  • 优点:查找是 O(1)
  • 缺点:初始化相对较慢,因为 std::vector 需要显式初始化每个元素(并且可能也独立)

我也可以使用 C 风格的数组(我可以在上面使用 memset),但由于事先不知道实例的数量(或唯一数字的数量),我需要编写自己的代码来扩展数组 memset数组的其余部分,......(这不是很难,但这是我想避免的)。

是否有任何其他类型的数据结构可以非常快速地初始化并且具有 O(1) 查找时间?

4

2 回答 2

8

你可以试试boost::unordered_set新的 C++11 std::unordered_set。它们是基于散列的容器,而不是像 std::set 这样的树。

于 2012-04-27T11:45:20.060 回答
5

嗯,用这么简单的识别方法……我会用哈希表。

不能用boost::unordered_maporstd::unordered_map吗?

当然,如果您想要保证 O(1) 插入而不是摊销 O(1) 插入,您可能更喜欢更复杂的实现,但它应该可以帮助您入门。

于 2012-04-27T11:46:11.693 回答