向量迭代器错误

问题描述:

我正在写一个基于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; 
    } 
} 

}

当我运行它会打开一个错误消息框,说矢量迭代器不dereferencable的exe文件。这是什么意思 ?

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

你不能这样做* xIter或* yIter。

返回引用矢量容器中过去结束元素的迭代器。

过去结束的元素是遵循向量中最后一个元素的理论元素。它不指向任何元素,因此不应被解除引用。

由于标准库函数使用的范围不包括其关闭迭代器指向的元素,因此此函数通常与vector :: begin结合使用以指定包含容器中所有元素的范围。

如果容器为空,则此函数返回与vector :: begin相同的结果。

您应该使用vector.back()而不是vector.end(),vector.back()将引用返回到向量末尾的值。 或者,您可以使用vector.at(vector.size() - 1)或与vector[vector.size() - 1]相同