c++ 双矢量超出范围

kqlmhetl  于 2023-05-30  发布在  其他
关注(0)|答案(2)|浏览(154)
#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;


int main() {
    int n, x, y, z, xres, yres, zres;
    cin >> n;
    vector<vector<int>> vec(n);

    while(n--) {
        vector<int> aux(3);
        cin >> aux.at(0) >> aux.at(1) >> aux.at(2);
        vec.push_back(aux);

    }
    for ( int i = 0; i < vec.size(); i++ ) {
        for (int j = 0; j < vec[i].size(); j++) {
            cout << vec.at(i).at(j) << " ";
            }
        cout << endl;
    }
    cout << vec.at(0).at(0);
    return 0;
}

为什么for循环可以工作,但是试图直接访问一个元素会产生一个超出范围的错误,说这个向量的大小是0?我认为for循环也只是把一些数字放在i和j的位置。输入是这样的:

3
1 2 3
1 2 3
1 2 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)
Aborted (core dumped)
zlhcx6iw

zlhcx6iw1#

创建的初始向量包含n个空向量:

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

稍后,您推送n非空向量。在此之后,外部向量包含2 * n向量,其中第一个n为空。
你应该用

vector<vector<int>> vec;
vec.reserve(n); // allocate the necessary storage, but the size remains 0 for now
while(n--)
{
    vector<int> aux(3);
    cin >> aux.at(0) >> aux.at(1) >> aux.at(2);
    vec.push_back(std::move(aux)); // std::move avoids a copy here
}

或者是

vector<vector<int>> vec(n, std::vector<int>(3));

// vec is completely allocated now; just fill existing elements
for (auto& v : vec)
{
    std::cin >> v[0] >> v[1] >> v[2];
}
kpbwa7wx

kpbwa7wx2#

向量最初的大小为3,然后再添加三个元素。
试试这个

vector<vector<int>> vec; // initial size zero

while(n--) {
    vector<int> aux(3);
    cin >> aux.at(0) >> aux.at(1) >> aux.at(2);
    vec.push_back(aux); // add new item

}

或者这个

vector<vector<int>> vec(n); // initial size 3

for (int i = 0; i < vec.size(); ++i) {
    vector<int> aux(3);
    cin >> aux.at(0) >> aux.at(1) >> aux.at(2);
    vec[i] = aux;           // overwrite existing item

}

相关问题