如何将唯一指针向量中的每个元素排入队列? (C++)

Posted

技术标签:

【中文标题】如何将唯一指针向量中的每个元素排入队列? (C++)【英文标题】:How to enqueue each element in a vector of unique pointers? (C++) 【发布时间】:2021-06-09 09:04:26 【问题描述】:

我正在尝试将唯一指针向量的每个元素推入队列,但由于某种原因,我的代码无法编译。

我得到的错误是:error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = Foo; _Dp = std::default_delete<Foo>]’

由于我将唯一指针向量移动到 enqueue 函数中,然后再次将每个元素移动到 queue_ 中,我不确定为什么这不起作用。

#include <memory>
#include <vector>
#include <queue>

class Foo ;

class Bar 
  
 public:
  template<typename Container>
  void enqueue(Container c) 
    for (const auto &e : c) 
      queue_.push(std::move(e));
    
  ;
  
 private:
  std::queue<std::unique_ptr<Foo>> queue_;
;

int main() 

  Bar bar;

  std::vector<std::unique_ptr<Foo>> c;
  c.push_back(std::make_unique<Foo>());

  bar.enqueue(std::move(c)); // this line is causing problem

;

【问题讨论】:

const auto &amp;e, std::move(e): 移动 const 元素会复制... 啊,谢谢。我不知道。 【参考方案1】:

你有一个额外的const 可以避免移动,而是做一个(删除的)副本:

删除它并使用:

for (auto &e : c) 
    queue_.push(std::move(e));

Demo

【讨论】:

非常感谢@Jarod42。 或许更好for (auto &amp;&amp;e : c)

以上是关于如何将唯一指针向量中的每个元素排入队列? (C++)的主要内容,如果未能解决你的问题,请参考以下文章

如何从 CDN 将 WordPress 中的脚本排入队列?

Android Work Manager:如何每月将作业排入队列

如何从 C++ 中的“指向对象的指针”向量访问对象

指向向量的 C++ 指针

C++:指向向量(及其元素)的指针是不是稳定,因为随着向量的增长,向量将在内存中迁移以适应更多元素? [复制]

C++中的双指针向量