在C++中std :: vector :: operator =的意外行为

M31*_*310 1 c++ linux g++ vector

我被期待与

v2 = v1
Run Code Online (Sandbox Code Playgroud)

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

执行结果是:

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

为何这种奇怪的行为?

jua*_*nza 7

你的期望是正确的.v2 = v1;将所有元素复制v1v2.问题是你正在访问你的向量越界.这是未定义的行为.

std::vector::reserve不会增加他们的大小.它只是根据需要为大小分配更多存储空间.您需要调用std::vector::resize,初始化向量以具有正确的大小,或者push_back在循环中调用.

请注意,您应该使用size()成员变量,begin()end()迭代器或基于范围的for循环来迭代向量.这将确保您不会访问越界.