【问题标题】:How to deal with std::out_of_range error in the given code?如何处理给定代码中的 std::out_of_range 错误?
【发布时间】:2019-12-27 16:53:36
【问题描述】:

下面的 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()-i-1 在 a.size() = 6 的情况下从 5 变为 0。那为什么代码不起作用?问题出在哪里?

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

【问题讨论】:

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


    【解决方案1】:

    std::vector&lt;int&gt; b 使用std::vectordefault constructor (1) 来初始化大小为0 的向量,因此b.at(i) 将始终超出范围。

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

    但是使用反向迭代器(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 << " ";
    }
    

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

    【讨论】:

    • @user9194161 你是什么意思?在你的代码中?在我的代码中?
    • 对不起!它在我的代码中。它工作正常。谢谢先生。
    【解决方案2】:

    在开始任意分配之前,您需要确保ba 的大小相同。只需一个额外的构造函数参数即可:

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

    【讨论】:

      猜你喜欢
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      相关资源
      最近更新 更多