2013-06-04 6 views
0

Я пишу игру на змею на основе Allegro и имею проблему с вектором, который содержит координаты частей змеи.Ошибка векторного итератора

Вот функция, которая удаляет последний элемент змеи и добавляет новый. Ранее я объявил vector <int> snake_x ; vector <int> snake_y;, и я также отбросил требуемые числа в векторе.

void moove_snake(int direction){ 
switch (direction){ 
    case UP: 
    { 
     vector <int>::iterator xIter; 
     vector <int>::iterator yIter; 
     snake_x.erase(snake_x.begin()); 
     snake_y.erase(snake_y.begin()); 
     xIter=snake_x.end(); 
     yIter=snake_y.end(); 
     snake_x.push_back(*xIter); 
     snake_y.push_back(*yIter-20); 
     draw(); 
     al_flip_display(); 
     al_rest(0.4); 
     break; 
    } 
    case DOWN: 
    { 
     vector <int>::iterator xIter; 
     vector <int>::iterator yIter; 
     snake_x.erase(snake_x.begin()); 
     snake_y.erase(snake_y.begin()); 
     xIter=snake_x.end(); 
     yIter=snake_y.end(); 
     snake_x.push_back(*xIter); 
     snake_y.push_back(*yIter+20); 
     draw(); 
     al_flip_display(); 
     al_rest(0.4); 
     break; 
    } 
    case LEFT: 
    { 
     vector <int>::iterator xIter; 
     vector <int>::iterator yIter; 
     snake_x.erase(snake_x.begin()); 
     snake_y.erase(snake_y.begin()); 
     xIter=snake_x.end(); 
     yIter=snake_y.end(); 
     snake_x.push_back(*xIter-20); 
     snake_y.push_back(*yIter); 
     draw(); 
     al_flip_display(); 
     al_rest(0.4); 
     break;  
    } 
    case RIGHT: 
    { 
     vector <int>::iterator xIter; 
     vector <int>::iterator yIter; 
     snake_x.erase(snake_x.begin()); 
     snake_y.erase(snake_y.begin()); 
     xIter=snake_x.end(); 
     yIter=snake_y.end(); 
     snake_x.push_back(*xIter+20); 
     snake_y.push_back(*yIter); 
     draw(); 
     al_flip_display(); 
     al_rest(0.4); 
     break; 
    } 
} 

}

Когда я запустить исполняемый файл он открывает окно с сообщением об ошибке, что вектор итератор не разыменовываемыми. Что это значит ?

ответ

3
xIter=snake_x.end(); 
    yIter=snake_y.end(); 

Вы не можете этого сделать * xIter or * yIter.

Возвращает итератор, ссылающийся на элемент конца в векторном контейнере.

Прошедший элемент - это теоретический элемент, который будет следовать за последним элементом вектора. Он не указывает на какой-либо элемент и, следовательно, не должен быть разыменован.

Поскольку диапазоны, используемые функциями стандартной библиотеки, не включают элемент, обозначенный их закрывающим итератором, эта функция часто используется в сочетании с вектором :: begin, чтобы указать диапазон, включающий все элементы в контейнере.

Если контейнер пуст, эта функция возвращает то же, что и вектор :: begin.

3

Вы должны использовать vector.back() вместо vector.end(), vector.back() возвращает ссылку на значение в конце вектора. В качестве альтернативы вы можете использовать vector.at(vector.size() - 1) или то же, что и vector[vector.size() - 1]

Смежные вопросы