在容器之间移动std::unique_ptr

Moving a std::unique_ptr between containers

本文关键字:unique ptr std 移动 之间      更新时间:2023-10-16

我遇到了一个问题,试图在容器之间移动unique_ptrs。我有一个std::unordered_set,叫做elements,它包含一堆unique_ptrs。我想把它们中的一些移到另一个名为子元素的unordered_set中。我该怎么做呢?

下面是我的函数:
void MeshContainer::MoveSubelements(){
  int mesh_dim = MeshDimension();
  for(auto el=elements.begin(); el!= elements.end(); ++el){
    if((*el)->getDim() != mesh_dim){
      subelements.insert(std::move(*el));
      elements.erase(*el);
    }
  }
}
使用上面的代码,我得到以下编译错误:

错误:使用已删除函数' std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = MEl;[p]

我认为问题出在复制构造函数上,但我认为使用std::move可以解决这个问题。

任何想法?

谢谢!

std::setstd::multiset只允许 const 访问它们的元素。这意味着你不能将某物移出集合。如果可以将项移出(或修改它们),则可以通过更改项的排序顺序来打破集合。因此c++ 11禁止这样做。

因此,您尝试使用std::move算法将只调用复制构造函数。

一旦你把unique_ptrs放到集合中,它们就被卡住了。