得到一个OUTOFRANGE误差向量在C ++中使用的插入方法时

问题描述 投票:0回答:1

我使用的插入方法时,在C ++中得到一个OUTOFRANGE误差向量。我不知道为什么发生这种情况,但我可以通过调试来缩小问题一行。下面是完整的代码。

//

#include <cstdio>
#include <iostream>
#include <vector>
#include <fstream>
#include <cassert>
#include <string>

using namespace std;


class suffixArray{


public: suffixArray(std:: string concatenated ){


    vector<int> attempt1;

    const int size = (int)concatenated.length();
    int rank[7] = {};

    char *suffixPointers[concatenated.length()];
    int value[concatenated.length()];

    for(int i =0; i <= size-1; i++){
        suffixPointers[i] = &concatenated[i];
        value[i] = (int)concatenated[i];
    }
    std::cout << "[";
    for(int i = 0; i<= size-1; i++){

        std::cout  <<value[i] << " ";
    }
    std::cout << "]"<< std:: endl;




    for(int i = 0; i<=size -1; i++){
        if(i == 0){
            rank[i] = i;
            attempt1.push_back(i);
        }
        else if(value[i] > value[i-1]){
            rank[i] = i;
            attempt1.push_back(i);
        }else{
            int current =i;
            int savedValue = value[i];
            int prevSavedRank;
            int indexcounter = i;
            while(savedValue <= value[attempt1.at(indexcounter-1)] && indexcounter - 1 >= 0  ){
                indexcounter--;

            }
            cout << indexcounter << endl;
            attempt1.insert(attempt1.begin() + indexcounter ,i);
//            while(savedValue <= value[rank[current-1]] && current-1 >= 0){
//                prevSavedRank= rank[current-1];
//                rank[current-1] = i;
//                rank[current] = prevSavedRank;
//                current--;
//            }
        }
    }

    int now;
    for(int i = 0; i<= 3; i++){
        now = attempt1[i];
        std::cout <<  now << " ";
    }
}
};





void read_file(string filename, string& contents, int& num_lines){
    ifstream f;
    f.open(filename.c_str());
    string line;

    contents = "";
    num_lines = 0;
    while(getline(f, line)){
        contents.append(line.substr(0, line.length()));
        num_lines++;
    }

    f.close();
}

int main(int argc, const char* argv[]) {

    std:: string test = "BANANA$";
    suffixArray testString (test);

    string fn;
    string contents;
    int num_lines;

    cout << "File 1:" << endl;
    cin>> fn;
    read_file(fn, contents, num_lines);

    cout << "Read: " << fn << "\n";
    cout << "  * " << num_lines << " lines\n";
    cout << "  * " << contents.length() << " characters (excluding newlines)\n";
    //cout <<"   * " << contents << endl;

   // char * contents_cstring = (char*)contents.c_str();
    //for(int i =0; i< contents.length(); i++){
     //   assert(contents_cstring[i] == *(contents_cstring + 1));
       // assert(contents_cstring[i] == contents.at(i));
    //}
    //assert(contents_cstring[contents.length()] == '\0');
    return 0;
}

我已经缩小的问题是从该行的问题,但无法弄清楚它为什么发生,或如何解决它。

尝试1.insert(尝试1.begin()+索引计数器,I);

c++ error-handling indexoutofrangeexception
1个回答
0
投票

考虑第一次程序到达

int indexcounter = i;
while(savedValue <= value[attempt1.at(indexcounter-1)] && indexcounter - 1 >= 0){
    indexcounter--;

}

i将是1 indexcounter-1将为0,如果进入循环,

int indexcounter = 1;
while(savedValue <= value[attempt1.at(0)] && 0 >= 0  ){
    1--;

}

好的,那么怎么下一次会发生什么?

while(savedValue <= value[attempt1.at(-1)] && -1 >= 0  ){
    0--;

}

value[attempt1.at(-1)]发生之前-1> = 0,S,以防止陷阱-1失败。反向测试的顺序。

while(indexcounter - 1 >= 0 && savedValue <= value[attempt1.at(indexcounter-1)])

可能是更多的错误,但在这之后的程序挂起,并要求我没​​有一个文件。

© www.soinside.com 2019 - 2024. All rights reserved.