在std :: vector中使用类对象

时间:2012-11-03 20:39:23

标签: c++ std

什么是更好的 -

std::vector<MyClass*>

std::vector<MyClass>

? 我的意思是,第二个选项是否会将对象存储在堆中? 哪一个更快更清洁?

4 个答案:

答案 0 :(得分:4)

是的,第二个版本也会将对象存储在堆上,但形式更紧凑,即MyClass数组。

在第一种形式中,您必须分配取消分配您的对象,而std::vector将在第二个版本中为您执行此操作。

因此,一如既往,这取决于您的需求和要求。如果您可以选择,请采用第二种形式:

std::vector<MyClass>

维护起来要容易得多。

答案 1 :(得分:4)

在大多数情况下,

std::vector<MyClass>会更好。是的,默认情况下它会将对象存储在堆(动态存储)中。{/ 1}。

优点是对象在向量销毁时自动销毁,并在单个连续内存块中分配,从而减少堆碎片。所以这样更干净。

这种方式也更快,因为它可以最小化内存分配操作。 Vector将在构造对象之前预先分配存储,因此对于N个对象,它将是M个分配操作和N个构造函数调用,N&gt; M(N越大 - 差异越大)。如果手动创建对象并通过指针将它们放置到向量,则将导致M个分配和N个构造,M = N + X,其中X是向量存储分配。如果您知道存储对象的数量,则始终可以最小化矢量内存分配 - 使用std::allocator

相反,使用std::vector::reserve()指针将需要您手动销毁对象,例如为动态分配的对象调用std::vector。不建议这样做。此类容器只能用作非拥有。在这种情况下,对象所有权应在外部维护。

答案 2 :(得分:0)

取决于。当然,在容器中存储类的副本更容易使用,但是每次都需要运行复制构造函数以将实例保存到容器中,这可能会有问题。此外,您的容器不能存储除一个类之外的任何内容 - 特别是它不能存储基类中专用(继承)的其他类。因此,通常,您通常最终必须存储指向该类的指针。

存储指针存在障碍。但是,为了充分利用这两个方面,请考虑使用boost :: ptr_vector,它具有智能指针的优势,而且没有开销。

答案 3 :(得分:0)

std::vector<MyClass>会将对象存储在堆上(可能),std::vector<MyClass*>会将指针存储在堆(可能)以及对象的任何位置。如果您需要在适用时再次支持继承std::vector<MyClass>,请在适用时使用std::vector<std::unique_ptr<MyClass>>。如果你的矢量不应该拥有这些物体,那么std::vector<MyClass*>会很有用,但情况很少。