C++ 如何从std:queue中分离元素
我有一个全局C++ 如何从std:queue中分离元素,c++,stl,C++,Stl,我有一个全局std::queue,多个线程以同步方式从中逐个拾取元素。队列由多个结构组成 每个线程调用.front()来获取第一个/下一个元素并对其进行本地复制,然后从队列中调用.pop()它(以便另一个线程通过调用.front()来获取下一个元素) 问题:复制元素会影响性能 是否有任何方法可以将元素从队列中分离出来?(这样它就不再是队列的一部分。同时它也不会被删除。调用者将负责删除。)您请求的队列操作不存在。备选方案: 使结构可移动。从front()移动,然后从对象移动pop()。请注意,如
std::queue
,多个线程以同步方式从中逐个拾取元素。队列由多个结构组成
每个线程调用.front()
来获取第一个/下一个元素并对其进行本地复制,然后从队列中调用.pop()
它(以便另一个线程通过调用.front()
来获取下一个元素)
问题:复制元素会影响性能
是否有任何方法可以将元素从队列中分离出来?(这样它就不再是队列的一部分。同时它也不会被删除。调用者将负责删除。)您请求的队列操作不存在。备选方案:
- 使结构可移动。从
移动,然后从对象移动front()
。请注意,如果您的结构非常大(例如,它有一个大数组作为成员),那么移动速度仍然会很慢,因为对象本身的内容仍然必须复制。但是,如果由于pop()
成员或其他原因,复制结构的成本很高,那么移动结构的成本会更低string
- 使用指向真实数据的智能指针队列。复制智能指针非常便宜,因此即使复制整个对象不满足性能要求,这也可能很好地满足您的性能要求
- 不要使用队列,而是使用
,并列表
将前面的元素拼接到使用者线程使用的另一个列表中。一旦处理完毕,将其从每线程列表中删除。我并不推荐这样做,但我提到了它,因为它是最接近从容器中分离对象的方法。它与原始列表分离,但必须同时重新附加到其他列表
- 使结构可移动。从
移动,然后从对象移动front()
。请注意,如果您的结构非常大(例如,它有一个大数组作为成员),那么移动速度仍然会很慢,因为对象本身的内容仍然必须复制。但是,如果由于pop()
成员或其他原因,复制结构的成本很高,那么移动结构的成本会更低string
- 使用指向真实数据的智能指针队列。复制智能指针非常便宜,因此即使复制整个对象不满足性能要求,这也可能很好地满足您的性能要求
- 不要使用队列,而是使用
,并列表
将前面的元素拼接到使用者线程使用的另一个列表中。一旦处理完毕,将其从每线程列表中删除。我并不推荐这样做,但我提到了它,因为它是最接近从容器中分离对象的方法。它与原始列表分离,但必须同时重新附加到其他列表
A
std::queue
通常不是链表;元素(或至少元素块)是连续的。如果复制是一个问题,您可以使用一个指针队列;过去,我使用动态分配的指针队列,使用std::unique_ptr
(实际上是std::auto_ptr
,因为它是在过去的。)astd::queue
通常不是一个链表;元素(或至少元素块)是连续的。如果复制是一个问题,您可以使用一个指针队列;过去,我使用动态分配的指针队列,使用std::unique_ptr
(实际上是std::auto_ptr
,因为它是过去的。)你可以离开它。@chris回答这个问题(对不起,关于之前的评论,把它与priority_queue
混淆了)。哦,是的,你是正确的。我只是查看了队列方法,没有找到任何方法。哈哈。谢谢。是的,请回答这个问题。@Angew,没时间了;在工作中:pYou可以离开它。@chris回答这个问题(很抱歉,关于之前的评论,把它与优先级\u队列
)噢,是的,你是正确的。我只是查看了队列方法,没有找到任何方法。哈哈。谢谢。是的,请回答这个问题。@Angew,没时间了;工作时:pRegd使用智能指针:在堆栈上创建的结构被直接复制到队列。在堆上创建它的副本会增加开销。使用列表注册不符合我的要求。事实上,我已经从list
Regd moving移动到queue
,如果移动实际上是拷贝,那么这与我当前所做的不一样吗?@Andrew“堆上的拷贝”比“队列中的拷贝”的开销更大吗?你甚至不必首先在堆栈中创建拷贝。关于移动,例如:复制std::vector
复制向量的全部内容。移动std::vector
会复制std::vector
对象中实际存储的3个指针(或类似的指针,基于实现)。看到区别了吗?@Angew:Sry我以前从未用过move。这是因为史蒂夫说,因为对象本身的内容仍然必须被复制。我有点困惑。但我现在将根据您所说的来探讨这个选项。Regd使用智能指针:在堆栈上创建的结构将直接复制到队列。在堆上创建它的副本会增加开销。使用列表注册不符合我的要求。事实上,我已经从list
Regd moving移动到queue
,如果移动实际上是拷贝,那么这与我当前所做的不一样吗?@Andrew“堆上的拷贝”比“队列中的拷贝”的开销更大吗?你甚至不必首先在堆栈中创建拷贝。关于移动,例如:复制std::vector
复制向量的全部内容。移动一个std::vector
复制3个指针(或类似的,基于实现的)实际值