我应该在我的类中的std :: vector成员变量中使用std :: unique_ptr <T>吗?

low*_*der 6 c++ stl smart-pointers c++11 visual-c++-2012

想象一下class C,有一个m_MyList类型的成员变量std::vector,我想在其中存储类型的对象MyClass.C有两个函数可以添加或删除对象m_MyList. m_MyList也应该让消费者可以访问,C因为他们需要阅读MyClass对象集合.集合的外部阅读器无法更改集合,因此MyClass对象仅由C.

现在我的问题是:在C++ 11风格中,向量中存储的最佳T是什么?可能性似乎是:

  • std::vector<MyClass>
  • std::vector<MyClass*>
  • std::vector<unique_ptr<MyClass>>使用std:moveunique_ptrvector

jua*_*nza 13

如果MyClass对象是拥有的C,那么最好的选择是最简单的:

std::vector<MyClass>
Run Code Online (Sandbox Code Playgroud)

std::unique_ptrs在这里使用的唯一原因是你需要保持指向多态的基类的指针.在这种情况下,unique_ptrs用于在向量被破坏时释放资源.但是C接口不应该将所有权转移给客户端.

  • `MyClass`可能是移动/复制成本高的对象.使用指针可以调整矢量大小,而无需复制大量内存. (5认同)

Jam*_*kin 12

std::vector<MyClass*>如果C拥有对象,则原始指针()不正确.其他两个非常相似,具有以下权衡:

  • std::vector<MyClass> - 要求MyClass可以复制和/或移动
  • std::vector<unique_ptr<MyClass>> - 需要(额外)动态分配

在容器上执行的操作类型也可能是相关的.举一个极端的例子,如果MyClass很大并且容器被重复洗牌,那unique_ptr将是更好的选择.

  • @rubenvb:向量一次只需要一次动态分配(或在重新分配期间短暂地分配2次).因此它不需要动态分配;-)如果`MyClass`足够小,你最终会注意到差异.我想可能更好的说法是"在动态分配中需要更多的开销".如果您为了浪费内存而单独输入额外代码,那将是一件坏事.如果`MyClass`不是可构造的,那么*可能是一件坏事,并且你会在不会发生的地方引入动态分配,从而引入异常. (2认同)