C++ 最快队列容器(C+;+;)

C++ 最快队列容器(C+;+;),c++,stl,C++,Stl,我使用的是队列和优先级队列,通过它们,我计划非常快速地抽取大量数据 因此,我希望我的q和pq对加法和减法有反应 使用向量、列表或deque作为底层容器的相对优点是什么 更新: 在撰写本文时,迈克·西摩和史蒂夫·汤森的以下答案都值得一读。谢谢你们 我会对基本队列使用std::queue,它(至少默认)是deque上的包装器。如果不适合你,就做一些更特殊的事情 std::priority_queue也存在(默认情况下,在vector上),但添加的语义使您更有可能必须在此处滚动自己的队列,具体取决于为

我使用的是队列和优先级队列,通过它们,我计划非常快速地抽取大量数据

因此,我希望我的q和pq对加法和减法有反应

使用向量、列表或deque作为底层容器的相对优点是什么

更新:
在撰写本文时,迈克·西摩和史蒂夫·汤森的以下答案都值得一读。谢谢你们

我会对基本队列使用
std::queue
,它(至少默认)是
deque
上的包装器。如果不适合你,就做一些更特殊的事情

std::priority_queue
也存在(默认情况下,在
vector
上),但添加的语义使您更有可能必须在此处滚动自己的队列,具体取决于为特定访问模式观察到的性能

vector
具有存储特性,这使得它非常不适合从数据集前面删除。每次你
pop\u front
的时候都要做大量的洗牌。对于简单队列,请避免使用此选项


list
对于任何高命中率队列来说都可能过于昂贵,因为根据合同,它必须提供您不需要的功能。它可以作为优先队列使用,但我的直觉总是相信STL。

vector
将实现堆栈,因为快速插入在末尾,快速删除也在末尾。如果需要FIFO队列,
vector
将是错误的实现

deque
list
都在两端提供恒定时间插入<代码>列表适用于LRU缓存,在LRU缓存中,您希望将元素快速移出中间位置,并希望迭代器保持有效,无论您移动了多少
deque
通常在插入和删除结束时使用

关于您的集合,我需要问的主要问题是它们是否被多个线程访问。我有点假设它们是,在这种情况下,您的主要目标之一是减少锁定。如果您至少有一个multi_push和multi_get功能,这样您就可以一次放置多个元素而无需任何锁定,那么这是最好的选择

还有免锁集装箱或半免锁集装箱


您可能会发现,只要您的操作都是固定时间的,锁定策略就比集合本身的任何性能更重要。

确保选择如何影响性能的唯一方法是在类似于预期用例的情况下对其进行测量。尽管如此,以下是一些观察结果:

对于
std::queue

  • std::deque
    通常是最佳选择;它在固定时间内支持所有必要的操作,并在内存增长时分块分配内存
  • std::list
    也支持必要的操作,但由于内存分配较多,速度可能较慢;在特殊情况下,通过从专用对象池进行分配,您可能能够获得良好的结果,但这并不完全简单
  • std::vector
    无法使用,因为它没有
    pop_front()
    操作;这样的操作会很慢,因为它必须移动所有剩余的元素
一种可能更快但灵活性较差的替代方法是在固定大小的数组上实现循环缓冲区(例如,
std::array
,或不调整大小的
std::vector
)。您需要通过报告错误或分配更大的缓冲区并复制所有数据来处理它被填满的情况

对于
std::priority\u队列

  • std::vector
    通常是最佳选择;它呈指数增长(减少内存分配的数量),是一种简单的数据结构,访问速度非常快——迭代器可以简单地实现为指针的包装器
  • std::deque
    可能较慢,因为它通常呈线性增长(需要更多的内存分配),并且访问比使用向量更复杂
  • std::list
    无法使用,因为它不提供随机访问

总而言之,默认值通常是最好的选择,但是如果速度真的很重要,那么请衡量备选方案。

史蒂夫,我不明白你的第一句话。在我的设计中,我必须同时使用队列和优先级队列。问题是我应该为它们使用什么底层容器?默认情况下,队列使用
deque
。我不确定优先级队列是否有默认值,但我目前使用的是
vector
@Richard:
vector
不能用于
队列
,因为它不提供
pop\u front()
。这是
priority\u queue
的一个很好的选择(也是默认选择),它只能从容器的后面推动和弹出。@Richard-就像STL的用法所建议的那样,我怀疑您是否可以为队列和priority\u queue使用相同的底层存储,从而获得最佳的结果。“这说明了吗?我完全同意,”史蒂夫汤森说。在同一个问题中处理这两种数据结构可能是拙劣的风格。你是对的,@SteveTownsend。当添加优先级大于队列中现有优先级的元素时,基于向量的优先级队列似乎异常缓慢。在一个算法中,识别这些元素并通过FIFO队列使其速度提高了37%。