从向量中删除元素会删除多个元素(C+;+;) 我一直在构建一个小型的RoGuiSK ASCII游戏,它使用控制台来构建我有限的C++知识。我已经设置好了,所以当玩家对象的坐标与某个项目(存储在向量中)相同时,它会删除该项目并向玩家的HP添加10

从向量中删除元素会删除多个元素(C+;+;) 我一直在构建一个小型的RoGuiSK ASCII游戏,它使用控制台来构建我有限的C++知识。我已经设置好了,所以当玩家对象的坐标与某个项目(存储在向量中)相同时,它会删除该项目并向玩家的HP添加10,c++,vector,C++,Vector,这个项目从房间里的9个项目开始。但是,每当我获得该项时,它都会删除向量中的前5项(但出于某种原因,它们仍在屏幕上绘制),并将50项添加到运行状况。所以我只剩下4项。下一次我得到一个项目时,它会删除前2个项目,并向健康添加20个项目。现在我只剩下两项。最后两次,它一次删除一项 所以,本质上,每次我得到一个项目时,向量都被分成两半。我已经通过大量调试缩小了问题的范围,并且我非常确定它来自以下代码块: for(int i=0;i<ia.size();i++) //If the player to

这个项目从房间里的9个项目开始。但是,每当我获得该项时,它都会删除向量中的前5项(但出于某种原因,它们仍在屏幕上绘制),并将50项添加到运行状况。所以我只剩下4项。下一次我得到一个项目时,它会删除前2个项目,并向健康添加20个项目。现在我只剩下两项。最后两次,它一次删除一项

所以,本质上,每次我得到一个项目时,向量都被分成两半。我已经通过大量调试缩小了问题的范围,并且我非常确定它来自以下代码块:

for(int i=0;i<ia.size();i++) //If the player touches an item
{
        if(grid[p.getY()][p.getX()]==itm)
        {
            hp+=10;
            cout << "Item "<<i<<" removed\n";
            swap(ia[i], ia.back());
            ia.pop_back();
            system("pause");
        }
}

for(int i=0;i有评论建议
erase()
,但请注意,它将一个接一个地复制以后的数组元素,以填充被腾空的索引:如果不关心元素顺序,交换方法可能会快得多,而且更好

一个问题是将
back()
元素交换到要删除的元素所占据的位置,然后增加迭代器以测试下一个
ia
索引。这意味着从
back()复制的项
本身从未经过测试-因此,在执行
交换后,您希望避免
i++
。当然,如果只有一个项目可以占据网格位置,您可以按照abiessu的评论,
中断

下面是一些我认为您需要的代码:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> ia{ 10, 20, 30, 40, 50, 60, 70 };
    for(size_t i=0;i<ia.size(); ) //If the player touches an item
    {
        if(ia[i] % 20)
        {
            cout << "Item "<<i<<" removed\n";
            swap(ia[i], ia.back());
            ia.pop_back();
            continue;
        }
        else
            ++i;
}
    for (size_t i = 0; i < ia.size(); ++i)
        std::cout << '[' << i << "] " << ia[i] << '\n';
}
#包括
#包括
使用名称空间std;
int main()
{
向量ia{10,20,30,40,50,60,70};

对于(size_t i=0;iUse std::vector::erase?可能是
中断;
if(…)中)
会有帮助…我也尝试了vector::erase,但没有任何更改。您的比较可能是错误的:
itm
无论如何与您的vector/迭代不相关,因此我猜每次迭代都会执行if块。但是,如果没有更多信息,则无法判断。另外请注意,您可以替换
swap(…);ia.pop_back();
带有
ia.erase(i)
。请参阅以获取参考。除此之外:如果您通常使用向量或集合:使用迭代器的迭代比使用索引的迭代更可取。如果您使用c++11,则每种迭代都会更好。速度在这里完全没有意义,如果我有的话,在这种情况下首选交换将是过早优化的完美示例另一个选项是选择哪一个在代码可读性方面更好。@Paranaix:当然欢迎您的意见,但O(N^2)与O(N)在我看来并不是“完全没有意义”:至少在编写代码时,您应该意识到这一点,不管它是否影响您的选择。