我正在写一个基于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;
}
}
}
当我运行exe文件时,会打开一个错误消息框,说明矢量迭代器不能解除引用。这意味着什么?
答案 0 :(得分:3)
xIter=snake_x.end();
yIter=snake_y.end();
你不能这样做* xIter或* yIter。
返回一个迭代器,引用向量容器中的past-the-end元素。
过去结束元素是跟随向量中最后一个元素的理论元素。它没有指向任何元素,因此不应被解除引用。
因为标准库的函数使用的范围不包括其闭合迭代器指向的元素,所以此函数通常与vector :: begin结合使用以指定包含容器中所有元素的范围。
如果容器为空,则此函数返回与vector :: begin。
相同的内容答案 1 :(得分:3)
您应该使用vector.back()
代替vector.end()
,vector.back()
会返回对向量末尾的值的引用。
或者,您可以使用vector.at(vector.size() - 1)
或vector[vector.size() - 1]