class item {
int i;
};
vector<item> ls(3); // line 1
item i1(1); // line 2
ls.push_back(i1); // line 3
我的问题在第3行,最初的3副本ctr在做什么?
答案 0 :(得分:4)
vector ls(3);
您的期望:
您可能希望将item
的默认构造函数调用3
次,而不是默认构造函数被调用一次而复制构造函数3
次。
实际发生的事情:
它正在创建一个类item
对象,然后将其复制到向量的每个元素。有3
个元素,因此3
复制构造函数调用。
<强>理由:强>
人们不能假设std::vector
如何构造元素。标准仅表示必须有默认构造函数,而不会强制std::vector
实现在这方面做具体的其他任何事情。
ls.push_back(I1);
实际发生的事情:
最初为3
元素创建了向量,因此当您按下4th
元素时,必须将前第一个3
元素复制到新位置,以便向量可以容纳新元素然而,这有一个有条件的分配,这解释了3
复制构造函数调用。方法push_back
创建一个正在添加的elelemnt的副本,然后将其添加到向量中,这样就会导致4th
复制构造函数调用,在所有这些中导致4
复制构造函数调用
答案 1 :(得分:3)
vector
是一个自动增长的数组。当超出内部阵列的当前容量时,会创建一个更大的新阵列,并将元素复制到新阵列。
假设vector
容量实际上只保留了足够的空间来存储3个元素,当你按第四个元素时,必须将前3个元素复制到新数组。