C++报错”out_of_range”的原因以及解决办法

  • Post category:C++

std::out_of_range是一个C++标准库异常,表示尝试访问容器或字符串的位置超出范围。当程序出现std::out_of_range异常,通常意味着程序在使用标准库时访问了无效的索引或下标,导致程序崩溃。

在C++中可以通过以下两种方式来避免和解决std::out_of_range异常:

1. 使用容器成员函数前检查合法性

当使用STL容器时,务必确保成员函数的参数在容器范围内。例如,可以使用容器的成员函数size()获取容器的大小,以确保容器范围内的索引。例如:

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> vec { 1, 2, 3, 4, 5 };
    if (3 < vec.size()) {
        std::cout << vec.at(3) << std::endl;
    }
    return 0;
}

在这个示例中,使用了std::vector的成员函数size获取容器的大小,并使用if语句判断索引值是否在范围内。如果索引值小于容器大小,就使用std::vector的成员函数at()获取索引对应位置上的值,否则程序不执行容器的访问操作,避免了std::out_of_range异常。

2. 使用try-catch结构处理异常

另一种避免和解决std::out_of_range异常的方法是使用try-catch结构处理异常。例如:

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> vec { 1, 2, 3, 4, 5 };
    try {
        std::cout << vec.at(5) << std::endl;
    } catch (const std::out_of_range& e) {
        std::cerr << "Range error: " << e.what() << std::endl;
    }
    return 0;
}

在这个示例中,使用try-catch结构处理std::out_of_range异常。如果访问溢出,就会引发std::out_of_range异常,并抛出异常到try-catch结构。catch语句接收异常,并输出异常信息,程序继续执行。

总之,避免并解决std::out_of_range异常的关键在于编写健壮的代码,处理异常情况并选择有保证的访问容器的方法。