問題

私は私のコードで私のwhileループで範囲外の例外を取得しています。

代わりにArrayを使用しようとしましたが、エラーは同じループ構造では発生しません。なぜこれが起こるのか混乱しています。私はsavedValue< = value [rank.at(current-1)])文がエラーの原因であると信じています。

 int suffixArray::size;
std::vector<int> suffixArray::rank;


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

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

}



#include <iostream>
#include <vector>


class suffixArray{
public: static int  size;
public: static std::vector<int> rank;


public: suffixArray(std:: string concatenated ){

    size =(int) concatenated.length();
    std:: cout << size << std:: endl;
    rank.resize(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.assign(i,i);
        }
        else if(value[i] > value[i-1]){
          rank.assign(i,i);
        }else{
            int current =i;
            int savedValue = value[i];
            int prevSavedRank;
            while(current-1 >= 0 && savedValue <= value[rank.at(current-1)]){
                prevSavedRank= rank.at(current-1);
                rank.assign(current-1, i);
                rank.assign(current, prevSavedRank);
                current--;
            }
        }
    }



}
};
 

  ベストアンサー

プログラムにより多くのログを追加すると、問題が明らかになります。rank.assign(0,0) - 最初の0は新しいvectorの長さを指定するため、この呼び出しはvectorのすべての要素を削除します(cppreference の std::vector::assignのドキュメントを参照) rank.at(0):0は空のvectorに有効なインデックスではないので、std::out_of_range

あなたの論理を再考しなければならないでしょう。

余分なロギングを持つプログラム:

 #include <iostream>
#include <vector>

template <typename T>
struct Vector : std::vector<T>
{
    void assign(size_t count, const T& value)
    {
        std::cout << "assign(count " << count << ", " << value << ")
";
        std::vector<T>::assign(count, value);
    }

    const T& at(size_t pos) const
    {
        std::cout << "at(" << pos << ")
";
        return std::vector<T>::at(pos);
    }
};

class suffixArray{
public: static int  size;
public: static Vector<int> rank;


public: suffixArray(std:: string concatenated ){

    size =(int) concatenated.length();
    std:: cout << size << std:: endl;
    rank.resize(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.assign(i,i);
        }
        else if(value[i] > value[i-1]){
          rank.assign(i,i);
        }else{
            int current =i;
            int savedValue = value[i];
            int prevSavedRank;
            while(current-1 >= 0 && savedValue <= value[rank.at(current-1)]){
                prevSavedRank= rank.at(current-1);
                rank.assign(current-1, i);
                rank.assign(current, prevSavedRank);
                current--;
            }
        }
    }
}
};

int suffixArray::size;
Vector<int> suffixArray::rank;

int main( int argc, char* argv[]) {
    std:: string test = "BANANA$";
    suffixArray testString (test);
}
 

出力:

 7
[66 65 78 65 78 65 36 ]
assign(count 0, 0)
at(0)
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)
 

代わりにArrayを使用しようとしましたが、エラーは同じループ構造では発生しません。

std::arrayおよびCスタイル配列(T[])は固定サイズのコンテナであり、std::vector::assignに相当するものがないため、vectorのサイズを変更するために使用しているので、プログラムは非常に頻繁に変更されている必要があります。

  同じタグがついた質問を見る

c++vectorstdvectorindexoutofrangeexception