我有一个快速的问题让我感到悲痛。作为一个更大的项目的一部分,我想扫描一个向量为0的元素,当我找到它们时,删除它们。我很好奇为什么以下是好的:
if (playerVec[5] == 0)
但这不是:
for(vector<Player>::iterator it = playerVec.begin(); it != playerVec.end(); ++it) {
if(playerVec[it] == 0) { //Invalid if condition
}
我认为它与它是迭代器的因素有关,但我怎么能在for循环中处理删除?我需要另一个变量来建立索引吗?
答案 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)
std::erase(std::remove(playerVec.begin(), playerVec.end(), 0), playerVec.end());
条件无效的原因是因为迭代器不是索引。它就像一个指向元素的指针,你可以这样使用它(用*
和->
来访问元素)。例如,代码中的正确条件为if(*it == 0)
。