gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:54:56 27 4
gpt4 key购买 nike

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;
}

输出:

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

为什么 ith push_back 导致 i 次复制构造函数调用?

这不是一种调整大小效果(即再次复制原始 vector )并且将元素插入 vector 的效率很低吗?

为什么 4th push_back 的行为与 2th 不同, 3th abd 5th push_back?

Demo

最佳答案

没什么大不了的。每次它的 size 达到它的 capacity 时, vector 都会被重新分配。所有元素都从旧 vector 复制到新 vector 。

一般来说,新的vector会分配原来容量的两倍。

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

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

此外,在重新分配时需要调用析构函数,当不再需要旧 vector 时应销毁其中的成员。

关于c++ - 为什么连续的 vector::push_back 会导致不同数量的构造函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41161838/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com