Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从std:queue中分离元素_C++_Stl - Fatal编程技术网

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
    ,因为它是在过去的。)

    a
    std::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个指针(或类似的,基于实现的)实际值