vector<X> v;
X x;
v.push_back(x); v.push_back(x); v.push_back(x);
为什么此代码会调用类X
6次的复制构造函数? (使用g ++ 4.7.2 STL)
拜托,我想知道正是在这个特定STL的引擎盖下会发生什么。
答案 0 :(得分:12)
当您使用x
插入push_back()
时,内存最终会重新分配,以便为新元素腾出空间。然后必须使用复制构造函数X(const X&)
复制已插入的成员。
如果您插入
v.reserve(3);
至少在前三个push_back()
中禁止重新分配,因此,只有三次调用X(const X&)
答案 1 :(得分:1)
你可以使用矢量储备来预先在矢量中创建空间,以加速向量添加元素并阻止其发生。
答案 2 :(得分:1)
这就是:
在第一个push_back之前,向量的容量(适合其分配的空间的元素数)为0.因此,当您执行第一个push_back时,它为1个项目分配空间并调用复制构造函数(第一次电话会议。)
所以现在容量是1,你告诉它添加另一个项目。因此,它必须分配更多空间,在这种情况下,为另外一个项目分配空间并将原始项目复制到新空间(第二次调用)。第二个push_back再次调用复制构造函数(第三次调用)。
现在你的容量为2,并告诉它添加另一个项目。因此,它必须分配更多空间并将项目复制到新空间(第4和第5次调用)。然后第三个push_back再次调用复制构造函数(第6次调用)。
正如其他人所指出的,您可以使用reserve,它将预先分配空间,从而无需重新分配,从而调用复制构造函数。
答案 3 :(得分:0)
正确答案是std::vector
是使用doubleling-array实现的(请参阅:http://en.wikipedia.org/wiki/Dynamic_array),它调用的复制构造函数约为2 * N
次。
例如,对于N = 100,000
,它会调用复制构造函数231,071
次。正如已经指出的那样,通过呼叫v.reserve()
可以减少重新分配的数量。