c++ 中的向量<vector<largeObject>> 与vector<vector<largeObject>*>

Posted

技术标签:

【中文标题】c++ 中的向量<vector<largeObject>> 与vector<vector<largeObject>*>【英文标题】:vector<vector<largeObject>> vs. vector<vector<largeObject>*> in c++ 【发布时间】:2011-01-18 01:52:56 【问题描述】:

显然,它会因您使用的编译器而异,但我很好奇 vector&lt;vector&lt;largeObject&gt;&gt;vector&lt;vector&lt;largeObject&gt;*&gt; 的性能问题,尤其是在 c++ 中。具体来说:

假设您的外部向量已满,并且您想开始将元素插入到第一个内部向量中。如果外部向量只是存储指针,与存储整个内部向量相反,它将如何存储在内存中。是否必须移动整个外部向量以获得更多空间,或者是否会移动内部向量(假设空间未预先分配),从而导致外部向量出现问题?

谢谢

【问题讨论】:

你是说矢量>?那么vector在幕后使用指针吗? @Leif 当然可以,向量毕竟是动态数组。 A vector 内部可能只是一个指针,但它仍然有一个 O(n) 复制构造函数。 @Leif -- 当然可以。但这不是重点。关键是使用原始指针的原因很少。当然,性能提升不是其中之一。标准库的编写者之间有数百年的经验,相信他们尽可能高效地编写代码。 vector >> 怎么样? 【参考方案1】:

Vector 在内部是一个指针,所以 vector 指针有点矫枉过正。

指针向量或智能指针通常在需要多态内容时使用。

在 C++03 中,插入更多向量或(擦除现有向量)主向量可能会很昂贵,但 C++0x 甚至通过其移动语义解决了这个问题。

在使用真实数据进行分析后,最好稍后切换到更合适的容器,而不是试图使其最初变得非常动态。

【讨论】:

我不同意,如果 T 的复制构造函数很复杂或有其他不希望的副作用,这并不总是“矫枉过正”。【参考方案2】:

我的第一个问题是“为什么要使用嵌套向量?”如果您不需要“二维数组”的尺寸呈锯齿状,则可以使用单个向量和规范的 2D 索引到 1D 数组 (x + width * y)。

也就是说,由于向量在调整大小时会复制 T 个实例,等等,指向大对象的指针向量可能会更便宜,因为副本会更小(复制指针与“大对象”相比)。不利的一面是您必须自己管理大型对象的分配,但是诸如 boost 的 shared_ptr 之类的东西可以提供帮助(或者如果您有 0x 支持,则可以使用标准版本 - 但不是 auto_ptr)。这里的“大对象”可以是任何东西,包括嵌套向量或指向向量的指针,如您的原始示例中需要的。

编辑:您还可以使用 reserve() 来预先分配向量中的空间,如果您可以保证要塞入向量中的东西的数量,则可以防止大量复制。

【讨论】:

他不是在询问指向大对象的指针向量,而是在询问指向大对象向量的指针向量。 我知道,但是 vector 可能是一个“大对象”,因此调整 vector> 的大小可能会很昂贵,而 vector*> 会涉及更少的复制。我想我应该使用“大对象”以外的另一个术语,因为“大对象”也出现在问题中。 嵌套向量的原因正是如此,因为它需要是锯齿状的。虽然我知道内部向量的大小永远不会超过 4(所以我想我可以预先分配它),但它需要动态扩展到 4,这意味着如果我使用标准数组,我必须跟踪它。 【参考方案3】:

我认为在您的情况下性能不会有太大差异,只是您想何时花时间创建对象的问题。

有时最好使用vector&lt;vector&lt;BigObject*&gt;&gt;

【讨论】:

【参考方案4】:

性能问题的答案始终是:性能测试或性能分析。

同时考虑替代方案:

vector< vector< LargeObject* > >, 

vector< vector< shared_ptr<LargeObject> > >

最有效的方法取决于您执行的操作:

大量建设/破坏 副本 - 是否可以优化使用 向量::swap()? 是否从中间擦除元素 向量?

您想处理手动内存管理吗?如果答案是否定的,则坚持使用 vector > 直到出现性能问题。

为了保护自己以后不必因性能原因更改过多代码,您可以/应该将二维数组封装在一个类中。

【讨论】:

以上是关于c++ 中的向量<vector<largeObject>> 与vector<vector<largeObject>*>的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C++ 中的函数返回向量?

为啥我不能将整数向量推入 C++ 中的二维整数向量?

在 C++ 中返回一个向量

如何找到向量中的最大元素(C++)?

c++中的函数向量

在 C++ 中填充二维向量