删除循环内的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);