7

我正在尝试调试一个程序,这样做违背了我对 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);
}

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

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() 函数(我已经知道)的对象的副本,然后是其余元素存在于预先存在的也被复制到从前面开始的新向量中。

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

4

1 回答 1

11

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

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

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


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

于 2012-07-17T23:26:02.390 回答