使用迭代器通过索引删除向量?

时间:2013-06-15 00:20:42

标签: c++ vector iterator

我有一个快速的问题让我感到悲痛。作为一个更大的项目的一部分,我想扫描一个向量为0的元素,当我找到它们时,删除它们。我很好奇为什么以下是好的:

if (playerVec[5] == 0)

但这不是:

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

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

}

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

3 个答案:

答案 0 :(得分:2)

it是一个迭代器,而不是索引。如果要从(随机访问)迭代器it获取索引,只需执行:

 it - playerVec.begin()

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

if (*it == 0) { 
    // ...
}

答案 1 :(得分:2)

您可以使用remove_if功能删除容器中符合某些条件的元素:

#include <algorithm>

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

playerVec.erase(std::remove_if(playerVec.begin(), playerVec.end(), isZero),
                playerVec.end());

答案 2 :(得分:1)

使用erase-remove idiom

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

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