我正在尝试调试一个程序,这样做已经碰到了我对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()函数(我已经知道),然后是其余的预先存在的元素也会从前面复制到新的向量中。
我对这个过程的理解是否正确?
答案 0 :(得分:11)
std::vector
将其元素存储在数组中。数组总是具有固定大小,因此如果继续向std::vector
添加元素,其底层数组最终将填满。当数组已满并添加另一个元素(通过push_back
或其他添加新元素的成员函数)时,它必须:
此过程称为重新分配。 std::vector
的正确实现应该以指数方式调整数组的大小。 Visual C ++ std::vector
实现使用1.5倍的增长因子;其他实现可能使用不同的增长因子。
(*)C ++ 11增加了对移动对象的支持。