为什么连续的vector :: push_back导致不同数量的构造函数调用?

Sau*_*ahu 5 c++ destructor vector copy-constructor

class base
{
    private:
            int k;
    public:
            base(const base& b){ this->k = b.k; cout<<"  c-ctor "<<endl; }
            base(int a = 10){ k = a; }

            ~base(){cout << "destructor called\n";}
};

int main()
{
    base b, b1(2);
    vector<base> m;
    cout << "first pushback" <<endl;
    m.push_back(b);
    cout << "2nd pushback" <<endl;
    m.push_back(b1);
    cout << "3rd pushback" <<endl;
    m.push_back(b1);
    cout << "4th pushback" <<endl;
    m.push_back(b);
    cout << "5th pushback" <<endl;
    m.push_back(b);
    cout<<" =============================================== "<<endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

first pushback
  c-ctor 
2nd pushback
  c-ctor 
  c-ctor 
destructor called
3rd pushback
  c-ctor 
  c-ctor 
  c-ctor 
destructor called
destructor called
4th pushback
  c-ctor    
5th pushback
  c-ctor 
  c-ctor 
  c-ctor 
  c-ctor 
  c-ctor 
destructor called
destructor called
destructor called
destructor called
 =============================================== 

destructor called
destructor called
destructor called
destructor called
destructor called
destructor called
destructor called
Run Code Online (Sandbox Code Playgroud)

为什么TH push_back导致一些拷贝构造函数调用?

这不是一个调整大小的效果(即再次复制原始向量)和将元素插入向量的低效方式吗?

为什么4 push_back由具有比不同的行为2 ,3 ABD 5 push_back

演示

use*_*661 9

没有大碍.每次size到达它时,都会重新分配向量capacity.所有元素都从旧向量复制到新向量.

通常,为新矢量分配原始容量的两倍.

  1. 在1之前push_back,容量为1.因此不需要重新分配.
  2. 对于第二个push_back,容量需要加倍,因此对复制构造函数进行两次调用,首先将旧元素复制到新向量,然后复制第二个push_back.容量现在是2.
  3. 第三,push_back再次需要重新分配向量,因为容量现在是2.重新分配后容量变为4.
  4. 现在没有重新分配,所以只需要一次复制ctor(for push_back)的调用.容量仍然是4.
  5. 对于5th push_back,重新分配发生,4个旧元素和一个新元素(push_back)被复制到新向量.容量现在是8.

如果你继续前进,你会发现重新分配将在9日发生push_back.

此外,在重新分配时需要调用析构函数,此时不再需要旧的向量,因此应该销毁其中的成员.