3 回答

TA貢獻1828條經(jīng)驗 獲得超3個贊
你不應(yīng)該it在for循環(huán)中增加:
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 ='函數(shù)在”播放器“中不可用 ”,它來自erase()內(nèi)部用于operator=移動向量中元素的用法。為了使用erase(),類的對象Player必須是可賦值的,這意味著你需要operator=為Player類實現(xiàn)。
無論如何,你應(yīng)該盡可能地避免原始循環(huán)1,而應(yīng)該更喜歡使用算法。在這種情況下,流行的Erase-Remove Idiom可以簡化你正在做的事情。
allPlayers.erase(
std::remove_if(
allPlayers.begin(),
allPlayers.end(),
[](Player const & p) { return p.getpMoney() <= 0; }
),
allPlayers.end()
);

TA貢獻1784條經(jīng)驗 獲得超8個贊
您的具體問題是您的Player班級沒有賦值運算符。您必須使“播放器”可復(fù)制或移動,以便將其從矢量中移除。這是因為向量需要是連續(xù)的,因此需要重新排序元素以填充刪除元素時創(chuàng)建的間隙。
也:
使用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 關(guān)注
- 356 瀏覽
添加回答
舉報