C ++ std :: out_of_range vector :: _ M_range_check

时间:2014-10-12 11:47:18

标签: c++ std stdvector

我有这个代码

#include <iostream>
#include <cstdio>
#include <vector>
#define NMax 100

using namespace std;

vector <int> v(100);
int n;

FILE* in = freopen("input.in", "r", stdin);
FILE* out = freopen("output.out", "w", stdout);

void afiseaza(){
    int i;
    for(i = 1; i <= n; i++){
        fprintf(out, "%d", v.at(i));
    }
    fprintf(out, "\n");
}

void bkt(int i){
    if(i == n + 1) afiseaza();
    else{
        int i, j;
        for(j = v.at(i-1); j <= n; j++){
            v.at(i) = j;
        }
        bkt(i+1);
    }
}

int main()
{
    int i, j;
    fscanf(in, "%d", &n);
    bkt(1);

    fclose(in);
    fclose(out);
    return 0;
}

它抛出std :: out_of_range错误,我无法理解为什么,向量的大小在边界内。试图找到更多关于错误的信息,但无法在我的代码中找到问题 Ty适合你的时间

3 个答案:

答案 0 :(得分:1)

将此作为单独的答案添加,因为它与我的第一个建议完全不同。在bkt的循环中,声明一个新的locallly作用域i,它隐藏了函数参数并具有未定义的值。使用此i可能是您获得异常的原因。

答案 1 :(得分:0)

矢量索引从0开始,有效值为0到size-1。如果我正确地跟踪您的代码,如果您为bkt输入0或更少,则在第一次调用n时访问index - 1,然后在afiseaza中输入索引大小。

我建议您使用调试器逐步执行代码并随时观察值。

答案 2 :(得分:0)

您的代码首次尝试访问v时,会调用v.at(-1)。这显然是出界的。