3 回答
TA贡献1828条经验 获得超3个赞
你不应该it在for循环中增加:
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在身体本身中增加了。
至于错误“ 'operator ='函数在”播放器“中不可用 ”,它来自erase()内部用于operator=移动向量中元素的用法。为了使用erase(),类的对象Player必须是可赋值的,这意味着你需要operator=为Player类实现。
无论如何,你应该尽可能地避免原始循环1,而应该更喜欢使用算法。在这种情况下,流行的Erase-Remove Idiom可以简化你正在做的事情。
allPlayers.erase(
std::remove_if(
allPlayers.begin(),
allPlayers.end(),
[](Player const & p) { return p.getpMoney() <= 0; }
),
allPlayers.end()
);
TA贡献1784条经验 获得超8个赞
您的具体问题是您的Player班级没有赋值运算符。您必须使“播放器”可复制或移动,以便将其从矢量中移除。这是因为向量需要是连续的,因此需要重新排序元素以填充删除元素时创建的间隙。
也:
使用std算法
allPlayers.erase(std::remove_if(allPlayers.begin(), allPlayers.end(), [](const Player& player)
{
return player.getpMoney() <= 0;
}), allPlayers.end());
如果你有提升,甚至更简单:
boost::remove_erase_if(allPlayers, [](const Player& player)
{
return player.getpMoney() <= 0;
});
如果你不支持C ++ 11 lambdas
- 3 回答
- 0 关注
- 331 浏览
添加回答
举报