0

我有一个简短的问题,让我有些悲伤。作为一个更大项目的一部分,我想扫描一个向量以查找为 0 的元素,并在找到它们时将其删除。我很好奇为什么以下是可以的:

if (playerVec[5] == 0)

但这不是:

for(vector<Player>::iterator it = playerVec.begin(); it != playerVec.end(); ++it) {

if(playerVec[it] == 0) { //Invalid if condition

}

我认为它与它是一个迭代器的因素有关,但是我怎么能在 for 循环中处理删除呢?我需要另一个变量来索引吗?

4

3 回答 3

2

您可以使用该remove_if函数删除容器中满足某些条件的元素:

#include <algorithm>

bool isZero(Player p) {
  return p == 0;
}

playerVec.erase(std::remove_if(playerVec.begin(), playerVec.end(), isZero),
                playerVec.end());
于 2013-06-15T00:27:02.077 回答
2

it是一个迭代器,而不是一个索引。如果您想从(随机访问)迭代器中获取索引it,只需执行以下操作:

 it - playerVec.begin()

但是,在您的情况下,您只想取消引用迭代器以获取指向元素的值:

if (*it == 0) { 
    // ...
}
于 2013-06-15T00:22:52.923 回答
1

使用擦除删除成语

std::erase(std::remove(playerVec.begin(), playerVec.end(), 0), playerVec.end());

您的条件无效的原因是迭代器不是索引。它就像一个指向元素的指针,您可以这样使用它(使用*->访问元素)。例如,您的代码中的正确条件是if(*it == 0).

于 2013-06-15T00:51:05.477 回答