矢量<矢量<largeobject>&GT; vs. vector <vector <largeobject> *&gt;在c ++中</vector <largeobject> </vector <largeobject>

时间:2011-01-18 01:52:57

标签: c++ pointers vector

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

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

谢谢

4 个答案:

答案 0 :(得分:2)

Vector在内部是一个指针,因此vector的指针有点矫枉过正。

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

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

还要考虑其他选择:

vector< vector< LargeObject* > >, 

vector< vector< shared_ptr<LargeObject> > >

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

  • 许多建筑/破坏
  • 副本 - 可以优化使用它们 矢量::交换()?
  • 你从中间擦除元素吗? 向量?

您想要处理手动内存管理吗?如果答案是否定的,那么带有矢量的棒>直到出现性能问题。

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