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<vector<largeObject>>
与 vector<vector<largeObject>*>
的性能问题,尤其是在 c++ 中。具体来说:
假设您的外部向量已满,并且您想开始将元素插入到第一个内部向量中。如果外部向量只是存储指针,与存储整个内部向量相反,它将如何存储在内存中。是否必须移动整个外部向量以获得更多空间,或者是否会移动内部向量(假设空间未预先分配),从而导致外部向量出现问题?
谢谢
【问题讨论】:
你是说矢量vector
内部可能只是一个指针,但它仍然有一个 O(n) 复制构造函数。
@Leif -- 当然可以。但这不是重点。关键是使用原始指针的原因很少。当然,性能提升不是其中之一。标准库的编写者之间有数百年的经验,相信他们尽可能高效地编写代码。
vectorVector 在内部是一个指针,所以 vector 指针有点矫枉过正。
指针向量或智能指针通常在需要多态内容时使用。
在 C++03 中,插入更多向量或(擦除现有向量)主向量可能会很昂贵,但 C++0x 甚至通过其移动语义解决了这个问题。
在使用真实数据进行分析后,最好稍后切换到更合适的容器,而不是试图使其最初变得非常动态。
【讨论】:
我不同意,如果 T 的复制构造函数很复杂或有其他不希望的副作用,这并不总是“矫枉过正”。【参考方案2】:我的第一个问题是“为什么要使用嵌套向量?”如果您不需要“二维数组”的尺寸呈锯齿状,则可以使用单个向量和规范的 2D 索引到 1D 数组 (x + width * y)。
也就是说,由于向量在调整大小时会复制 T 个实例,等等,指向大对象的指针向量可能会更便宜,因为副本会更小(复制指针与“大对象”相比)。不利的一面是您必须自己管理大型对象的分配,但是诸如 boost 的 shared_ptr 之类的东西可以提供帮助(或者如果您有 0x 支持,则可以使用标准版本 - 但不是 auto_ptr)。这里的“大对象”可以是任何东西,包括嵌套向量或指向向量的指针,如您的原始示例中需要的。
编辑:您还可以使用 reserve() 来预先分配向量中的空间,如果您可以保证要塞入向量中的东西的数量,则可以防止大量复制。
【讨论】:
他不是在询问指向大对象的指针向量,而是在询问指向大对象向量的指针向量。 我知道,但是 vector我认为在您的情况下性能不会有太大差异,只是您想何时花时间创建对象的问题。
有时最好使用vector<vector<BigObject*>>
【讨论】:
【参考方案4】:性能问题的答案始终是:性能测试或性能分析。
同时考虑替代方案:
vector< vector< LargeObject* > >,
或
vector< vector< shared_ptr<LargeObject> > >
最有效的方法取决于您执行的操作:
大量建设/破坏 副本 - 是否可以优化使用 向量::swap()? 是否从中间擦除元素 向量?您想处理手动内存管理吗?如果答案是否定的,则坚持使用 vector > 直到出现性能问题。
为了保护自己以后不必因性能原因更改过多代码,您可以/应该将二维数组封装在一个类中。
【讨论】:
以上是关于c++ 中的向量<vector<largeObject>> 与vector<vector<largeObject>*>的主要内容,如果未能解决你的问题,请参考以下文章