删除循环内的vector的元素

我知道这个问题也有类似的问题,但是我没有设法通过他们的帮助find我的代码。 我只想通过检查一个循环内的这个元素的属性来删除/删除一个向量的元素。 我怎样才能做到这一点? 我尝试了下面的代码,但我收到错误的模糊消息:

'player ='function在'Player'中不可用。

for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); it++) { if(it->getpMoney()<=0) it = allPlayers.erase(it); else ++it; } 

我该怎么办?

更新:你认为与指针成员的问题载体::擦除属于相同的问题? 我需要一个赋值操作符吗? 为什么?

你不应该在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在'Player'中不可用 ,它来自内部使用operator=erase()使用来移动向量中的元素。 为了使用erase() ,类Player的对象必须是可赋值的,这意味着您需要为Player类实现operator=

忘了循环,并使用std或boost范围algorthims。
使用Boost.Range Lambda它看起来像这样:

 boost::remove_if( allPlayers, bind(&Player::getpMoney, _1)<=0 ); 
 if(allPlayers.empty() == false) { for(int i = allPlayers.size() - 1; i >= 0; i--) { if(allPlayers.at(i).getpMoney() <= 0) { allPlayers.erase( allPlayers.begin() + i ); } } } 

这是我的方式来删除vector元素。 这很容易理解,并不需要任何技巧。

你的具体问题是你的Player类没有赋值操作符。 你必须让“玩家”可以复制或移动,以从vector中移除它。 这是由于该vector需要连续,因此需要重新sorting元素以填补删除元素时创build的空白。

也:

使用stdalgorithm

 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 lambdaexpression式,请参阅TimW的答案。

或者向后循环。

 for (vector<Player>::iterator it = allPlayers.end() - 1; it != allPlayers.begin() - 1; it--) if(it->getpMoney()<=0) it = allPlayers.erase(it);