Исключение из диапазона при использовании цикла while с вектором в c ++ - PullRequest
0 голосов
/ 08 февраля 2019

Я получаю исключение вне диапазона с моим циклом while в моем коде.

Я попытался использовать массив, и ошибка не возникает с той же структурой цикла.Я запутался, почему это случилось.Я считаю, что оператор saveValue <= value [rank.at (current-1)]) </i> является причиной ошибки.

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--;
            }
        }
    }



}
};

1 Ответ

0 голосов
/ 08 февраля 2019

Добавление большего количества входов в вашу программу выявляет проблему: вы rank.assign(0,0) - первый 0 указывает новую длину vector, поэтому этот вызов удаляет все элементы в vector (см. std::vector::assign документына cppreference ), затем вызов 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 << ")\n";
        std::vector<T>::assign(count, value);
    }

    const T& at(size_t pos) const
    {
        std::cout << "at(" << pos << ")\n";
        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)

Я попытался использовать массив, и ошибка не возникает с той же структурой цикла.

std::array и массивы в стиле C (T[]) - это контейнеры фиксированного размера, не имеющие эквивалента std::vector::assign, который вы используете для изменения размера vector, поэтому ваша программа должна иметьбыл довольно сильно изменен - ​​не просто чистая замена массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...