删除循环内的向量元素

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


'operator ='功能在'播放器'中不可用。


 for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); it++)

 {

     if(it->getpMoney()<=0) 

         it = allPlayers.erase(it);

     else 

         ++it;

 }

我该怎么办?


更新:你认为带有指针成员的问题vector :: erase是否属于同一个问题?我需要一个赋值运算符吗?为什么?


繁华开满天机
浏览 332回答 3
3回答

倚天杖

你不应该it在for循环中增加:for (vector<Player>::iterator it=allPlayers.begin();&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; it!=allPlayers.end();&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /*it++*/) <----------- I commented it.{&nbsp; &nbsp;if(it->getpMoney()<=0)&nbsp;&nbsp; &nbsp; &nbsp; it = allPlayers.erase(it);&nbsp; else&nbsp;&nbsp; &nbsp; &nbsp; ++it;&nbsp;}注意评论部分; it++在那里不需要,因为it在身体本身中增加了。至于错误“ 'operator ='函数在”播放器“中不可用 ”,它来自erase()内部用于operator=移动向量中元素的用法。为了使用erase(),类的对象Player必须是可赋值的,这意味着你需要operator=为Player类实现。无论如何,你应该尽可能地避免原始循环1,而应该更喜欢使用算法。在这种情况下,流行的Erase-Remove Idiom可以简化你正在做的事情。allPlayers.erase(&nbsp; &nbsp; std::remove_if(&nbsp; &nbsp; &nbsp; &nbsp; allPlayers.begin(),&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; allPlayers.end(),&nbsp; &nbsp; &nbsp; &nbsp; [](Player const & p) { return p.getpMoney() <= 0; }&nbsp; &nbsp; ),&nbsp;&nbsp; &nbsp; allPlayers.end());&nbsp;

青春有我

您的具体问题是您的Player班级没有赋值运算符。您必须使“播放器”可复制或移动,以便将其从矢量中移除。这是因为向量需要是连续的,因此需要重新排序元素以填充删除元素时创建的间隙。也:使用std算法allPlayers.erase(std::remove_if(allPlayers.begin(), allPlayers.end(), [](const Player& player){&nbsp; &nbsp; return player.getpMoney() <= 0;}), allPlayers.end());如果你有提升,甚至更简单:boost::remove_erase_if(allPlayers, [](const Player& player){&nbsp; &nbsp; return player.getpMoney() <= 0;});如果你不支持C ++ 11 lambdas
打开App,查看更多内容
随时随地看视频慕课网APP