【问题标题】:getting a OUTOFRANGE error with vector in c++ when using insert method使用插入方法时,C++ 中的向量出现 OUTOFRANGE 错误
【发布时间】:2019-02-12 01:43:37
【问题描述】:

在使用插入方法时,我在 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;
}

我已将问题范围缩小到这一行的问题,但无法弄清楚它为什么会发生,或者如何解决它。

attempt1.insert(attempt1.begin() + indexcounter ,i);

【问题讨论】:

  • this answer 有帮助吗?
  • 您好,谢谢您的回复,我的意思是超出范围异常,我刚刚编辑了我的问题。不过还是谢谢你!
  • 当时indexcounterattemp1.size()是什么?
  • int value[concatenated.length()]; -- 这不是有效的 C++。 C++ 中的数组的大小必须由编译时常量表达式表示,而不是运行时值。你用的是std::vector,那你为什么不在这里用呢? std::vector&lt;int&gt; value(concatenated.length()).
  • 通过编译器运行您的代码。许多您可能想要解决的警告。它们可能很重要。

标签: c++ error-handling indexoutofrangeexception


【解决方案1】:

考虑程序第一次到达

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 之前,防止 -1 的陷阱失败。颠倒测试的顺序。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多