Добавление большего количества входов в вашу программу выявляет проблему: вы 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
, поэтому ваша программа должна иметьбыл довольно сильно изменен - не просто чистая замена массива.