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,在幕后发生了什么 确切的事情。
使用push_back()
插入x
时,内存最终会被重新分配以为新元素腾出空间。已插入的成员必须使用复制构造函数X(const X&)
进行复制。
如果您插入
v.reserve(3);
至少在前三个push_back()
操作中会防止重分配,结果只会有三次调用X(const X&)
您可以使用向量保留来提前在向量中创建空间,以加快向向量添加元素的速度,并防止这种情况发生。
正确的答案是,std::vector
是使用双倍数组实现的(参见:http://en.wikipedia.org/wiki/Dynamic_array),它大约调用了 2 * N
次复制构造函数。
例如,对于 N = 100,000
,它会调用复制构造函数 231,071
次。正如已经指出的那样,可以通过调用 v.reserve()
来减少重新分配的次数。
v.reserve(3)
,这应该会减少复制构造函数的调用次数。 - 0x26res