C++ 寻找一个';s快速初始化和快速查找(O(1))

C++ 寻找一个';s快速初始化和快速查找(O(1)),c++,performance,data-structures,C++,Performance,Data Structures,我需要一个数据结构,我想在其中存储有关我在操作期间已处理的实例的信息。由于限制,我无法将其存储在实例本身中(例如,因为我可以并行执行操作) 具体来说,我要存储信息的实例有一个唯一的编号,因此我可以使用该唯一编号来存储信息,而不是指向该实例的指针 我的第一个解决方案是使用std::set。每次处理一个实例时,我都会将其添加到集合中,以便知道我已经处理了该实例 优点:初始化速度非常快 缺点:查找不是O(1),而是O(logN) 我的第二个解决方案是使用std::vector(实际上std::ve

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

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

我的第一个解决方案是使用
std::set
。每次处理一个实例时,我都会将其添加到集合中,以便知道我已经处理了该实例

  • 优点:初始化速度非常快
  • 缺点:查找不是O(1),而是O(logN)
我的第二个解决方案是使用
std::vector
(实际上
std::vector
,因为布尔向量有一个特定的特化,这使得它比非布尔向量慢)。实例的唯一编号可以用作向量的索引,并且在向量中仅包含true或false,以指示我们是否已处理该实例(幸运的是,我的唯一编号从1开始计数)

  • 优点:查找是O(1)

  • 缺点:初始化速度相对较慢,因为std::vector需要显式地初始化每个元素(也可能是独立地初始化)
我也可以使用C风格的数组(我可以在其上使用memset),但由于实例的数量(或唯一数字的数量)事先不知道,我需要编写自己的代码来扩展数组,memset数组的其余部分,…(这不是很难,但这是我想要避免的)


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

您可以尝试
boost::unordered_set
或新的C++11。它们是基于哈希的容器,而不是像std::set这样的树。

好吧,有了这样一个简单的识别方法……我会使用哈希表

您不能使用
boost::unordered\u-map
std::unordered\u-map


当然,如果您希望有保证的O(1)插入而不是分期摊销的O(1)插入,您可能更喜欢更复杂的实现,但这应该让您开始。

std::bitset,并使用实例号作为要设置的位集中的位置?“缺点:初始化速度相对较慢”--你这么说了吗?结果是瓶颈吗?在发布模式下?@Vikas:试过了。位集比使用std::vector字节慢得多(是的,你丢失了7位,但速度快了一个数量级)@Kornel:是的,我们使用性能分析器来测量。是的,这是我们案例中的瓶颈,是的,在发布模式下。