如何从std:queue中分离元素

时间:2014-06-24 13:36:27

标签: c++ stl

我有一个全局std::queue,多个线程以同步方式逐个拾取元素。队列是结构。

每个线程调用.front()以获取第一个/下一个元素并对其进行本地复制,然后从队列中.pop()(以便另一个线程通过调用.front()来获取下一个元素)

问题:制作元素副本会对性能产生影响。

有没有办法从队列中分离元素? (因此它不再是队列的一部分。同时它也不会被删除。来电者将负责删除。)

2 个答案:

答案 0 :(得分:5)

您请求的队列操作不存在。备选方案:

  • 使结构可移动。从front()移动,然后移动pop()移动的对象。请注意,如果您的结构非常大(例如,它有一个大型数组作为成员),那么移动仍然可能很慢,因为仍然必须复制对象本身的内容。但是,如果由于string成员或其他原因而复制结构的成本很高,那么移动会更便宜。
  • 使用指向真实数据的智能指针队列。复制智能指针非常便宜,因此即使复制整个对象也不能满足您的性能要求。
  • 使用listsplice()前端元素而不是使用队列,而不是使用消费者线程使用的另一个列表。一旦处理完就将其从每个线程列表中删除。我并不是真的推荐这个,但我提到它是因为它最接近于从容器中分离对象。它与原始列表分离,但必须同时重新附加到其他列表。

答案 1 :(得分:0)

std::queue通常不是链接列表;元素(或至少元素的块)是连续的。如果复制是个问题,你可以使用指针队列;过去,我使用动态分配的指针队列取得了很好的成功,使用std::unique_ptr(实际上std::auto_ptr,因为它已经过去了。)