Я получаю исключение вне диапазона с моим циклом while в моем коде.
Вместо этого я попытался использовать массив, и ошибка не возникает с той же структурой цикла. Я в замешательстве, почему это произошло. Я считаю, что оператор saveValue <= 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 (см. Документы 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)
I have tried to use an Array instead and the error does not occur with the same loop structure.
Массивы std::array и C-style (T[]) представляют собой контейнеры фиксированного размера, в них отсутствует эквивалент std::vector::assign, который вы используете для изменения размера vector, поэтому ваша программа, должно быть, была сильно изменена, а не просто чистая замена массива.
@ user1118321: ты более любезен, чем я, по крайней мере, в это утро ;-). Сделанный. (О, здесь полдень!)
Вы пробовали напечатать "rank.at(current-1)?"