向量中的问题

时间:2011-10-13 04:36:12

标签: c++

class item {
    int i;
};
vector<item> ls(3);   // line 1
item         i1(1);   // line 2

ls.push_back(i1);     // line 3
  • 第1行:
    • 默认ctr调用一次
    • 复制ctr被调用3次
  • 第3行:
    • 复制ctr被调用4次

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

2 个答案:

答案 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个元素复制到新数组。