如何从std:queue中分离元素

Atu*_*tul 1 c++ stl

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

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

问题:复制元素会影响性能.

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

Ste*_*sop 5

您请求的队列操作不存在.备择方案:

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