C++ 矢量问题 类项目{ int i; }; 向量ls(3);//第1行 项目i1(1);//第2行 ls.向后推(i1);//第3行 第1行: 默认ctr调用一次 copy ctr被调用3次 第3行: copy ctr被调用4次
我的问题是在第3行,最初的3拷贝ctr在做什么?向量是一个自动增长的数组。当超过内部阵列的当前容量时,将创建一个更大的新阵列,并将元素复制到新阵列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个元素复制到新数组中 向量
假设
vector
容量实际上只保留了足够的空间来存储3个元素,当您按下第四个元素时,前3个元素必须复制到新数组中。avector
是一个自动增长的数组。当超过内部阵列的当前容量时,将创建一个更大的新阵列,并将元素复制到新阵列
假设vector
capacity实际上只保留了足够的空间来存储3个元素,当您按下第四个元素时,必须将前3个元素复制到新数组中
向量ls(3)
您的期望:您可能希望调用
项的默认构造函数3次,而不是调用一次默认构造函数和复制构造函数3次
实际发生的情况:
它创建一个classitem
对象,然后将其复制到向量的每个元素。有3
元素,因此有3
复制构造函数调用
理由:
我们不能假设元素是如何由std::vector
构造的。该标准只说明必须有一个默认构造函数,并且不强制std::vector
实现在这方面做任何其他特定的事情
ls.推回(i1)
实际发生的情况:
该向量最初是为3
元素创建的,因此当您推送4
元素时,必须将第一个3
元素复制到新位置,以便该向量可以容纳新元素并具有连续的分配,这就解释了3
复制构造函数调用。方法push_back
创建所添加元素的副本,然后将其添加到向量中,从而导致4th
copy构造函数调用,所有这些都会导致4
copy构造函数调用
向量ls(3)
您的期望:
您可能希望调用项的默认构造函数3次,而不是调用一次默认构造函数和复制构造函数3次
实际发生的情况:
它创建一个classitem
对象,然后将其复制到向量的每个元素。有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