如何处理给定代码中的std :: out_of_range错误?

时间:2019-12-27 16:53:36

标签: c++ g++ c++14

下面的C ++代码应该反转向量。

#include <bits/stdc++.h>

using namespace std;

vector<int> reverseArray(vector<int> a){
    vector<int> b;
    for (int i=0;i<a.size();i++){
        b.at(i) = a.at(a.size()-i-1);
    }
    return b;
}

int main(){
    int input;
    vector<int> arr;

    // read vector
    while(cin >> input){
        arr.push_back(input);
    }

    // print vector
    for (int i=0;i<arr.size();i++){
        cout << arr.at(i) << " ";
    }
    cout << endl <<"Reversed vector is:- ";
    vector<int> r_arr = reverseArray(arr);

    // print reversed vector
    for (int i=0;i<r_arr.size();i++){
        cout << arr.at(i) << " ";
    }
}

但是,将引发以下错误:-

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)

我检查a.size()= 6时a.size()-i-1从5变为0。为什么代码然后不起作用?问题出在哪里?

请帮助,我正在学习C ++ STL。

2 个答案:

答案 0 :(得分:3)

std::vector<int> b使用std::vector中的default constructor (1)来初始化大小为0的向量,因此b.at(i)将始终超出范围。

您需要使用a将其初始化为与std::vector<int> b(a.size())相同的大小。

但是使用反向迭代器(rbegin()rend())反转容器要容易得多:

std::vector<int> reverseArray(vector<int> a){
    std::vector<int> b(a.rbegin(), a.rend());
    return b;
}

因此您实际上不需要该功能:

cout << endl << "Reversed vector is:- ";
std::vector<int> r_arr(arr.rbegin(), arr.rend());

如果只需要以反转顺序打印/迭代,那么您甚至不需要中间向量:

// print vector reversed
for (auto it=arr.rbegin(); it!=arr.rend(); it++){
  cout << (*it) << " ";
}

如果您想撤消现有容器,而又不需要原始订单,则可以使用std::reverse

std::reverse(std::begin(arr), std::end(arr));
for( auto i: arr ) {
  cout << i << " ";
}

除了出于学习目的,绝对没有理由使用循环手动反转数组。

答案 1 :(得分:2)

您需要确保b的大小与a相同,然后才能开始对其进行任意分配。只需一个额外的构造函数参数即可:

vector<int> reverseArray(vector<int> a){
    vector<int> b(a.size());
    for (int i=0;i<a.size();i++){
        b.at(i) = a.at(a.size()-i-1);
    }
    return b;
}

另外,打印出反向数组的最后循环是在cout中索引错误的数组。它应显示为:

// print reversed vector
for (int i=0;i<r_arr.size();i++){
    cout << r_arr.at(i) << " ";
}