C ++:访问另一个方法返回的向量的常量向量时出现分段错误

时间:2017-02-12 12:09:16

标签: c++ vector

我的目标是从输入流填充向量的常量向量。 我能够这样做,并使用readVector()方法打印构造的矢量,如下所示。

但是当我尝试使用at()的{​​{1}}例程访问特定值时,它会产生错误越界。我甚至无法访问2d向量的[0,0]元素,尽管我能够打印整个向量。

std::vector
  

跑步:

     

输入:(两行分别包含元素#include <cmath> #include <cstdio> #include <vector> #include <iostream> #include <algorithm> using namespace std; inline const int myread() { int n; cin >> n; return n; } const vector< vector <int> > readVector (const int &n) { int i, j; vector< vector <int> > v (n); // Populate the vector v. for (i = 0; i < n; i++) { const int rs = myread(); // row size // construct an internal vector (iv) for a row. vector <int> iv(rs); for (j = 0; j < rs; j++) { cin >> iv[j]; } // Append one row into the vector v. v.push_back (iv); } return v; } int main() { const int n = myread(); // Construct a 2d vector. const vector< vector <int> > v (readVector (n)); // Prints the vector v correctly. for (vector <int> k : v) { for (int l : k) { cout << l << " "; } cout << endl; } // Produces the out of bounds error shown below cout << v.at(0).at(0); return 0; } 1, 5, 4。)

1, 2, 8, 9, 3

  

输出:

2 3 1 5 4 5 1 2 8 9 3

1 5 4 1 2 8 9 3

我是terminate called after throwing an instance of 'std::out_of_range' what(): vector::_M_range_check: __n (which is 0) >= this->size() (which is 0)的新手。请帮帮我。

2 个答案:

答案 0 :(得分:2)

问题在于行

vector< vector <int> > v (n);

已经创建了一个包含nint向量的向量,每个向量的大小为0.行

v.push_back (iv);

在空矢量后推送你的新矢量。您应该使用分配或使用

创建空向量
vector< vector <int> > v;

只需打印矢量大小

std::cout << v.size() << std::endl;

在每次迭代中看看会发生什么。

答案 1 :(得分:1)

另一种解决方法是声明一个像这样的矢量数组:

vector< int > v (n);

然后存储矢量:

v[i].push_back (iv);

以后需要按索引访问矢量时,这很有用。