如何从向量中删除特定值?

时间:2018-01-27 09:51:42

标签: c++ vector

基本上,我有一个结构的向量。我正在制作游戏Monopoly,我有一个playerStruct的向量。我可以选择让玩家离开游戏。但是,当矢量缩小时,我不知道如何删除任何播放器。例如,我有3名球员

Players 0,1,2

我使用擦除功能,

erase(vect.begin()+turnNumber);

我首先擦除仅为erase(vect.begin()+0)的玩家0并删除第一个元素。但是,如果我尝试通过调用erase(vect.begin()+1)来擦除玩家1,我最终会在向量缩小到2的情况下删除玩家2。

如何在向量减少时随时擦除玩家?我似乎无法想到一个公式erase(vect.begin()+(a number))能够从游戏中删除任何玩家而不会删除另一个不打算被删除的玩家。 谢谢。

2 个答案:

答案 0 :(得分:1)

这里的问题是:

的组合
  • 向量中对象的索引标识与其关联的玩家
  • 矢量可以改变(减小)大小,但玩家可以ID不会更改

因此,在对矢量进行任何更改后,通过玩家的ID对其进行索引将不再有效。

您可以尝试使用std::mapstd::unordered_map,这会将玩家编号映射到Player。然后,您可以使用要删除的播放器在地图上调用erase()

如果您必须使用std::vector,则需要让Player存储播放器的ID。然后,您可以在不使用矢量索引的情况下搜索要删除的玩家的矢量。

修改

例如,如果我们假设你的结构看起来像:

struct Player {
    int id;
    // ...other members
};

并且您有vector<Player> players,您可以使用std::remove_if删除玩家n

auto iter = remove_if(players.begin(), players.end(), [&](Player const & player) {
    return player.id == n;
});
players.erase(iter, players.end());

答案 1 :(得分:0)

从最后到第一个向后删除。