为了账号安全,请及时绑定邮箱和手机立即绑定

删除循环内的向量元素

删除循环内的向量元素

C++
繁华开满天机 2019-09-02 09:34:33
我知道这个问题有类似的问题,但我没有设法通过他们的帮助找到我的代码。我只想通过检查循环内该元素的属性来删除/删除向量的元素。我怎样才能做到这一点?我尝试了以下代码,但收到了错误的模糊消息:'operator ='功能在'播放器'中不可用。 for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); it++) {     if(it->getpMoney()<=0)          it = allPlayers.erase(it);     else          ++it; }我该怎么办?更新:你认为带有指针成员的问题vector :: erase是否属于同一个问题?我需要一个赋值运算符吗?为什么?
查看完整描述

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()

); 


查看完整回答
反对 回复 2019-09-02
?
青春有我

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

查看完整回答
反对 回复 2019-09-02
  • 3 回答
  • 0 关注
  • 331 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信