我知道有和这个类似的问题,但我没能在他们的帮助下找到我的代码的方法。我只想通过检查循环内此元素的属性来删除/删除 vector 的元素。我怎样才能做到这一点?我尝试了以下代码,但收到了模糊的错误消息:
'operator =' 函数在 'Player' 中不可用。
for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); it++)
{
if(it->getpMoney()<=0)
it = allPlayers.erase(it);
else
++it;
}
我该怎么办?
更新:你认为vector::erase with pointer member这个问题吗?属于同一个问题?因此我需要一个赋值运算符吗?为什么?
最佳答案
你不应该在 for
循环中递增 it
:
for (vector<Player>::iterator it=allPlayers.begin();
it!=allPlayers.end();
/*it++*/) <----------- I commented it.
{
if(it->getpMoney()<=0)
it = allPlayers.erase(it);
else
++it;
}
注意注释部分;那里不需要it++
,因为it
在for-body 本身中递增。
至于错误“'operator =' function is unavailable in 'Player'”,是由于内部使用了的
移动 vector 中的元素。为了使用erase()
的使用operator=erase()
,类Player
的对象必须是可分配的,这意味着您需要为 实现
类。operator=
播放器
无论如何,你应该避免raw loop 1 尽可能多,应该更喜欢使用算法。在这种情况下,流行的 Erase-Remove Idiom可以简化您正在做的事情。
allPlayers.erase(
std::remove_if(
allPlayers.begin(),
allPlayers.end(),
[](Player const & p) { return p.getpMoney() <= 0; }
),
allPlayers.end()
);
1。它是 the best talks by Sean Parent 之一我看过的。
关于c++ - 删除循环内 vector 的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43554673/