Issue in vector

Issue in vector

本文关键字:vector in Issue      更新时间:2023-10-16
class item {
    int i;
};
vector<item> ls(3);   // line 1
item         i1(1);   // line 2
ls.push_back(i1);     // line 3
  • 1号线:
    • 默认调用一次
    • copy ctr被调用3次
  • 第3行:
    • copy ctr被调用4次

我的问题是在第3行,最初的3个副本在做什么?

矢量ls (3);

你的期望:
您可能期望item的默认构造函数被调用3次,而不是默认构造函数被调用一次,复制构造函数被调用3次。

实际情况:
它正在创建一个类item对象,然后将其复制到向量的每个元素。有3元素,因此3复制构造函数调用。

原理:
我们不能假设这些元素是如何由std::vector构造的。标准的只说明必须有一个默认构造函数,并且不强制std::vector实现在这方面做任何其他特定的事情。


ls.push_back (i1);

实际情况:
vector最初是为3元素创建的,因此当您推入4th元素时,必须将第一个3元素复制到新的位置,以便vector可以容纳新元素并具有连续分配,这解释了3复制构造函数调用。方法push_back创建要添加的元素的副本,然后将其添加到vector中,从而导致4th复制构造函数调用,所有这些导致4复制构造函数调用。

vector是一个自动增长的数组。当超出内部数组的当前容量时,将创建一个更大的新数组,并将元素复制到新数组中。

假设vector容量实际上只保留足够的空间来存储3个元素,当您推送第四个元素时,前3个元素必须复制到新数组中。