C++矢量push_back()的详细信息

Details of C++ Vector push_back()

本文关键字:详细信息 back 矢量 push C++      更新时间:2023-10-16

我正在尝试调试一个程序,这样做与我对C++向量push_back()函数的理解相悖。

为了说明我的观点,我写了以下短程序:

#include <iostream>
#include <vector>
#include <cstdlib>
using std::cout;
using std::endl;
using std::vector;
class Test {
private:
  int mTestMember;
public:
  Test(int val);
  Test(const Test&);
  int GetValue() const;
};
Test::Test(int val)
{
  cout << "Constructorn";
  mTestMember = val;
}
Test::Test(const Test& test)
{
  cout << "Copy Constructorn";
  mTestMember = test.mTestMember;
  cout << "mTestMember: " << mTestMember << endl;
}
int main(){
  vector<Test> tests;
  tests.push_back(Test(int(5)));
  cout<< endl;
  tests.push_back(Test(int(6)));
  cout << endl;
  tests.push_back(Test(int(7)));
  return(0);
}

如果我编译并运行,我会得到以下输出:

Constructor
Copy Constructor
mTestMember: 5
Constructor
Copy Constructor
mTestMember: 6
Copy Constructor
mTestMember: 5
Constructor
Copy Constructor
mTestMember: 7
Copy Constructor
mTestMember: 5
Copy Constructor
mTestMember: 6

看起来,在push_back()函数的过程中,会对作为参数传递给push_back()函数(我已经知道了)的对象进行复制,然后将先前存在的元素中的其余元素也从前面开始复制到新的向量中。

我对这个过程的理解正确吗?

std::vector将其元素存储在数组中。数组总是有固定的大小,所以如果您不断向std::vector添加元素,它的底层数组最终会填满。当数组已满并且您添加了另一个元素(通过push_back或添加新元素的另一个成员函数)时,它必须:

  1. 创建一个新的、更大的阵列
  2. (*)元素从旧数组复制或移动到新数组
  3. 将新元素插入到新数组中,然后
  4. 摧毁旧阵列

此过程称为重新分配std::vector的正确实现应该按指数调整数组的大小。Visual C++std::vector实现使用了1.5倍的增长因子;其他实现方式可以使用不同的增长因子。


(*)C++11增加了对移动对象的支持