C++ Vector push_back()的详细信息

Whe*_*050 7 c++ vector

我正在尝试调试一个程序,这样做已经碰到了我对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 << "Constructor\n";
  mTestMember = val;
}

Test::Test(const Test& test)
{
  cout << "Copy Constructor\n";
  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);
}
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

看来,在push_back()函数的过程中,会执行一个副本,该对象作为参数传递给push_back()函数(我已经知道),然后是其余的元素.存在于预先存在的也从前面复制到新的向量.

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

Jam*_*lis 11

std::vector将其元素存储在数组中.数组总是具有固定大小,因此如果继续向a添加元素std::vector,其底层数组最终将填满.当数组已满并添加另一个元素(通过push_back或另一个添加新元素的成员函数)时,它必须:

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

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


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

  • @SethCarnegie:不允许(虽然使用微小的阵列可能看起来那样).*必须*调整一个因素,而不是简单地添加一个更大的常量.否则将无法满足"摊销常数"要求. (6认同)