我原本希望用
v2 = v1
将v1的内容复制到v2中。
我的经验是,如果v1的内容未在构造函数中初始化,则v1的内容不被复制到v2中。
只需看看代码:
#include <iostream>
#include <vector>
using namespace std;
int main (void) {
vector<int> v1; // if I use vector<int> v1(10,0); it just works fine
vector<int> v2;
v1.reserve(5);
v2.reserve(5);
for (int i = 0; i < 5; i++) v1[i] = i*i;
v2 = v1;
for (int i = 0; i < 5; i++) {
cout << "v1[" << i << "] = " << v1[i] << endl;
cout << "v2[" << i << "] = " << v2[i] << endl;
}
return 0;
}
执行结果是:
v1[0] = 0
v2[0] = 0
v1[1] = 1
v2[1] = 0
v1[2] = 4
v2[2] = 0
v1[3] = 9
v2[3] = 0
v1[4] = 16
v2[4] = 0
为什么会出现这种奇怪的行为?
答案 0 :(得分:7)
您的期望是正确的。 v2 = v1;
将v1
的所有元素复制到v2
。问题是你正在访问你的向量越界。这是未定义的行为。
std::vector::reserve
不会增加它们的大小。它只是根据需要为大小分配更多存储空间。您需要调用std::vector::resize
,初始化矢量以获得正确的大小,或者在循环中调用push_back
。
请注意,您应该使用size()
成员变量,begin()
和end()
迭代器,或基于范围的for循环来迭代向量。这将确保您不会访问越界。