繁体   English   中英

std :: vector和copy构造函数

[英]std::vector and copy constructors

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&)

您可以使用矢量预留来预先在矢量中创建空间,以加快向矢量添加元素以及阻止其发生。

这是发生的事情:

在第一个push_back之前,向量的容量(适合其分配的空间的元素数)为0.因此,当您执行第一个push_back时,它为1个项目分配空间并调用复制构造函数(第一个调用) 。

所以现在容量是一个,你告诉它添加另一个项目。 因此,它必须分配更多空间,在这种情况下,为另外一个项目分配空间并将原始项目复制到新空间(第二次调用)。 第二个push_back再次调用复制构造函数(第三次调用)。

现在你的容量为2,并告诉它添加另一个项目。 因此,它必须分配更多空间并将项目复制到新空间(第4和第5次调用)。 然后第三个push_back再次调用复制构造函数(第6次调用)。

正如其他人所指出的,您可以使用reserve,它将预先分配空间,从而无需重新分配,从而调用复制构造函数。

正确的答案是std::vector是使用doubleling-array实现的(参见: http//en.wikipedia.org/wiki/Dynamic_array ),它调用的复制构造函数约为2 * N倍。

例如,对于N = 100,000它调用复制构造函数231,071次。 正如已经指出的那样,通过调用v.reserve()可以减少重新分配的次数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM