我的目标是从输入流填充向量的常量向量。
我能够这样做,并使用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)
的新手。请帮帮我。
答案 0 :(得分:2)
问题在于行
vector< vector <int> > v (n);
已经创建了一个包含n
个int
向量的向量,每个向量的大小为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);
以后需要按索引访问矢量时,这很有用。