显然它会根据您使用的编译器而有所不同,但我很好奇在执行vector<vector<largeObject>>
与vector<vector<largeObject>*>
时的性能问题,尤其是在c ++中。具体来说:
假设您已将外部矢量填满,并且您希望开始将元素插入第一个内部矢量。如果外部向量只是存储指针,那将如何存储在内存中,就像存储整个内部向量一样。是否必须移动整个外部向量以获得更多空间,或者移动内部向量(假设空间未预先分配),从而导致外部向量出现问题?
谢谢
答案 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数组封装在一个类中。