繁体   English   中英

向量 <vector<largeObject> &gt;与矢量 <vector<largeObject> *&gt;在c ++中

[英]vector<vector<largeObject>> vs. vector<vector<largeObject>*> in c++

显然它会根据您使用的编译器而有所不同,但我很好奇在执行vector<vector<largeObject>>vector<vector<largeObject>*>时的性能问题,尤其是在c ++中。 具体来说:

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

谢谢

向量在内部是指针,因此向量的指针有点矫枉过正。

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

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

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

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

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

编辑:您还可以使用reserve()在向量中预先分配空间,如果您可以保证将要推送到向量中的内容数量,则可以防止大量复制。

我认为在你的情况下,性能没有太大的区别只是你何时想花时间创建对象。

有时候最好使用vector<vector<BigObject*>>

性能问题的答案总是:性能测试或简介。

还要考虑替代方案:

vector< vector< LargeObject* > >, 

要么

vector< vector< shared_ptr<LargeObject> > >

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

  • 大量的建筑/破坏
  • 副本 - 它们可以优化使用vector :: swap()吗?
  • 你从矢量中间擦除元素吗?

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

为了防止因以后出于性能原因而需要更改太多代码,您可以/应该将2D数组封装在一个类中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM