C++ 矢量问题 类项目{ int i; }; 向量ls(3);//第1行 项目i1(1);//第2行 ls.向后推(i1);//第3行 第1行: 默认ctr调用一次 copy ctr被调用3次 第3行: copy ctr被调用4次

C++ 矢量问题 类项目{ int i; }; 向量ls(3);//第1行 项目i1(1);//第2行 ls.向后推(i1);//第3行 第1行: 默认ctr调用一次 copy ctr被调用3次 第3行: copy ctr被调用4次,c++,C++,我的问题是在第3行,最初的3拷贝ctr在做什么?向量是一个自动增长的数组。当超过内部阵列的当前容量时,将创建一个更大的新阵列,并将元素复制到新阵列 假设vector容量实际上只保留了足够的空间来存储3个元素,当您按下第四个元素时,前3个元素必须复制到新数组中。avector是一个自动增长的数组。当超过内部阵列的当前容量时,将创建一个更大的新阵列,并将元素复制到新阵列 假设vectorcapacity实际上只保留了足够的空间来存储3个元素,当您按下第四个元素时,必须将前3个元素复制到新数组中 向量

我的问题是在第3行,最初的3拷贝ctr在做什么?

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


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

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

假设
vector
capacity实际上只保留了足够的空间来存储3个元素,当您按下第四个元素时,必须将前3个元素复制到新数组中

向量ls(3)

您的期望:
您可能希望调用
项的默认构造函数
3次,而不是调用一次默认构造函数和复制构造函数
3次

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

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


ls.推回(i1)

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

向量ls(3)

您的期望:
您可能希望调用
项的默认构造函数
3次,而不是调用一次默认构造函数和复制构造函数
3次

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

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


ls.推回(i1)

实际发生的情况:

该向量最初是为
3
元素创建的,因此当您推送
4
元素时,必须将第一个
3
元素复制到新位置,以便该向量可以容纳新元素并具有连续的分配,这就解释了
3
复制构造函数调用。方法
push\u back
创建要添加的元素的副本,然后将其添加到向量中,从而导致
4th
copy构造函数调用,所有这些都导致
4th
copy构造函数调用。

他的问题是关于
push\u back
,我想他指的是vector内部数组的增长。
的标准只说必须有一个默认构造函数。标准没有在任何地方说明这一点。如果它说,那么引用,我将删除否决票,并授予它一张赞成票。@Nawaz:与OP的Q完全无关,但我无论如何都更正了我答案中错误的引用。+1。现在看起来更好了,虽然基本原理部分的措辞可以改进。他的问题是关于
推回
,我认为他指的是vector内部数组的增长。-1对于
标准只说必须有一个默认构造函数
。标准没有在任何地方说明这一点。如果它说,那么引用,我将删除否决票,并授予它一张赞成票。@Nawaz:与OP的Q完全无关,但我无论如何都更正了我答案中错误的引用。+1。现在它看起来更好了,不过基本原理部分的措辞可以改进。谢谢您的编辑。它看起来好多了谢谢你的编辑。看起来好多了
class item {
    int i;
};
vector<item> ls(3);   // line 1
item         i1(1);   // line 2

ls.push_back(i1);     // line 3