Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中std::vector::operator=的意外行为+;_C++_Linux_Vector_G++ - Fatal编程技术网

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

C++ C+中std::vector::operator=的意外行为+;,c++,linux,vector,g++,C++,Linux,Vector,G++,我是被期待的 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

我是被期待的

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;
}

为什么会有这种奇怪的行为?

你的期望是正确的<代码>v2=v1
v1
的所有元素复制到
v2
中。问题是,您正在访问超出边界的向量。这是未定义的行为

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


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

您的期望是正确的<代码>v2=v1
v1
的所有元素复制到
v2
中。问题是,您正在访问超出边界的向量。这是未定义的行为

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

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

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