C++ 向量迭代器错误

C++ 向量迭代器错误,c++,vector,allegro,C++,Vector,Allegro,我正在写一个基于快板的蛇类游戏,但对包含蛇的各个部分坐标的向量有问题 下面是删除snake的最后一个元素并添加新元素的函数。 之前我已经声明了向量snake_x;媒介蛇并且我还将向量中所需的数字向后推 void moove_snake(int direction){ switch (direction){ case UP: { vector <int>::iterator xIter; vector <int>::iter

我正在写一个基于快板的蛇类游戏,但对包含蛇的各个部分坐标的向量有问题

下面是删除snake的最后一个元素并添加新元素的函数。 之前我已经声明了向量snake_x;媒介蛇并且我还将向量中所需的数字向后推

 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;
    }
}
void moove\u snake(内部方向){
开关(方向){
个案:
{
向量::迭代器xIter;
向量::迭代器yIter;
snake_x.erase(snake_x.begin());
snake_y.erase(snake_y.begin());
xIter=snake_x.end();
yIter=snake_y.end();
snake_x.推回(*xIter);
蛇形向后推(*yIter-20);
draw();
al_flip_display();
al_rest(0.4);
打破
}
按大小写:
{
向量::迭代器xIter;
向量::迭代器yIter;
snake_x.erase(snake_x.begin());
snake_y.erase(snake_y.begin());
xIter=snake_x.end();
yIter=snake_y.end();
snake_x.推回(*xIter);
蛇形向后推(*yIter+20);
draw();
al_flip_display();
al_rest(0.4);
打破
}
案例左:
{
向量::迭代器xIter;
向量::迭代器yIter;
snake_x.erase(snake_x.begin());
snake_y.erase(snake_y.begin());
xIter=snake_x.end();
yIter=snake_y.end();
snake_x.推回(*xIter-20);
蛇形回推(*yIter);
draw();
al_flip_display();
al_rest(0.4);
打破
}
案例权利:
{
向量::迭代器xIter;
向量::迭代器yIter;
snake_x.erase(snake_x.begin());
snake_y.erase(snake_y.begin());
xIter=snake_x.end();
yIter=snake_y.end();
snake_x.推回(*xIter+20);
蛇形回推(*yIter);
draw();
al_flip_display();
al_rest(0.4);
打破
}
}
}

当我运行exe文件时,它会打开一个错误消息框,指出向量迭代器不可取消引用。这意味着什么

    xIter=snake_x.end();
    yIter=snake_y.end();
你不能这样做

返回一个迭代器,该迭代器引用向量容器中结束元素的过去部分

结束元素的过去是向量中最后一个元素之后的理论元素。它不指向任何元素,因此不应取消引用

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

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

你不能这样做

返回一个迭代器,该迭代器引用向量容器中结束元素的过去部分

结束元素的过去是向量中最后一个元素之后的理论元素。它不指向任何元素,因此不应取消引用

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


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

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

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