2010-07-11 131 views
3

我想知道如果它是更快地具有std::vector<std::vector<double>>其中嵌套矢量总是有2个元素,或者是它更快地具有std::vector<MyPoint>其中MyPoint就像定义:哪个更快?

struct MyPoint { 
    double Point[2]; 
}; 

由于

+0

只要你没有测量,写出更容易阅读的代码(和使用'struct'的IMO)。只有牺牲了可读性,当你进行测量时,'vector'' vector's变得相当快。 – sbi 2010-07-12 08:02:53

回答

11

vector<MyPoint>是优选的,因为MyPoint可能:

  1. 要小于vector<double>(你可以用sizeof检查),和/或
  2. ,使更少的分配。矢量对象本身很小,但通常指向堆上的数据。通过将矢量对象中的数据嵌入,可以优化小矢量以避免额外的分配,但不要指望它,因此初始化,销毁和复制的开销较低。

例如,在我的32位gcc上,std::vector<double>的大小为12,而MyPoint的大小为16,但该向量使得额外分配。在64位实现中,MyPoint几乎肯定会是相同的大小,但std::vector可能会更大。

另外,矢量表示使用连续内存的可变大小的有序容器。所以对于size-2数组来说可以说是矫枉过正,因为矢量的使用引入了大小可能改变的可能性。

5

我假定在第二个例子中,你的意思是:std::vector<MyPoint>?是的,这个变种会更有效率。例如,您可以更轻松地保留大量内存,并且您将不得不少占总分配。

代替MyPoint,您也可以使用std::pair<double, double>

+0

+1提及'std :: pair '。 – rubenvb 2010-07-12 09:46:04

0

在第二个例子中,你的意思是std::vector<MyPoint>?这将比在矢量中具有矢量好得多。

1

不仅两个元素的向量速度较慢,而且动态结构总是保持2个元素(假设它不会改变),这看起来也很奇怪。为方便起见,我会使用struct MyPoint { double x, y; };