C++ 我应该使用std::unique\u ptr<;T>;在我的类中的std::vector成员变量中?

C++ 我应该使用std::unique\u ptr<;T>;在我的类中的std::vector成员变量中?,c++,stl,c++11,smart-pointers,visual-c++-2012,C++,Stl,C++11,Smart Pointers,Visual C++ 2012,想象一个类C有一个std::vector类型的成员变量m_MyList,我想在其中存储MyClass类型的对象C有两个功能,可以在m_MyList中添加或删除对象。 m_MyList也应该让C的消费者可以访问,因为他们需要阅读MyClass对象的集合。集合的外部读取器将无法更改集合,因此MyClass对象仅由C拥有 现在我的问题是: 在C++11风格中,向量中存储的最佳T是什么? 可能性似乎是: std::vector std::vector std::vector,使用std:move将un

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

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

  • std::vector
  • std::vector
  • std::vector
    ,使用
    std:move
    unique\u ptr
    推入
    vector

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

std::vector<MyClass>
std::vector 在这里使用
std::unique\ptrs
的唯一原因是,如果需要保留指向多态性基类的指针。在这种情况下,独特的PTR用于在载体被破坏时释放资源。但是
C
接口不应该将所有权转移给客户端。

如果C拥有对象,原始指针(
std::vector
)是不正确的。另外两种方法非常相似,有以下折衷:

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

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

除非对象是不可复制的,否则
unique\u ptr
解决方案不会真正为您带来任何好处。原始指针版本是完全有害的。只需简单的解决方案一个对象有多大,你打算存储多少?会有很多单次插入吗?
std::vector
的每个元素都放在免费存储中,所以说“需要动态分配”好像这是一件坏事,这有点用词不当…@rubenvb:vector一次只需要一次动态分配(或者在重新分配过程中只需要两次)。因此,它不需要动态分配;-)如果
MyClass
足够小,您最终会注意到差异。我想最好说,“在动态分配中需要更多的开销”。如果你只是为了浪费内存而输入额外的代码,这是一件坏事。如果
MyClass
是不可构造的,并且在不可能发生的地方引入动态分配,从而引入异常,那么这可能是一件坏事。每个对象的动态分配不仅占用更多内存,还会增加碎片并导致更多数据缓存未命中。在大多数代码中,这是完全不可察觉的,但正如Steve所说,不要键入更多的内容,以免代码变得更糟。
MyClass
可能是一个移动/复制成本较高的对象。使用指针可以调整向量的大小,而无需复制大量内存。@edA-qamort-ora-y这是真的,但它与所有权和客户端等无关,因此,我假设考虑的范围超出了问题的范围。使用任何类型的引用类型作为类成员的另一个原因是确保头不会公开该成员的详细信息,而单元文件(cpp)确实知道这一点。事实上,这有利于隔离。这里,向量要求在定义成员之前定义MyClass。因此,您必须包含MyClass代码。在某些情况下,你不希望这样。也就是说,它有不同的内存和管理成本,因此选择是非常特定于上下文的。@Klaim问题是,在
unique\u ptr
的情况下,是否需要完整的类型不是一个完全无关紧要的问题,请参见。@juanchopanza我知道,但是,如果您不想编写它,您仍然可以通过在cpp中定义构造函数和析构函数并使用=default来轻松修复它。