微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

std::vector.erase() 只删除了它应该删除的一半

如何解决std::vector.erase() 只删除了它应该删除的一半

我有一个程序,我必须删除结构向量的一些条目。我就是这样做的

  for(int i=0; i<molec.size(); i++)
    {
      if(!molec[i].mine)
        molec.erase(molec.begin()+i);
    }

molec.mine 是结构体中定义的布尔值。问题是,当我这样做时,它会使用molec.mine=false 擦除恰好一半的元素。我试图寻找一些替代方案,发现我可以用

vector.erase(std::remove(vec.begin(),vec.end(),1963),vec.end());

问题在于我不知道如何使用结构向量来实现。

我该如何解决这个问题?

解决方法

您可能正在寻找std::remove_if。如在

molec.erase(
  std::remove_if(
    molec.begin(),molec.end(),[](const auto& elem) { return !elem.mine; }),molec.end());
,

i++ 不应在元素为 erased 时执行。例如

for(int i=0; i<molec.size(); )
{
  if(!molec[i].mine)
    molec.erase(molec.begin()+i);
  else
    i++;
}

是的,您应该使用算法库来避免此类问题。

molec.erase(std::remove_if(molec.begin(),[](const auto& v) { return !v.mine;}),molec.end());

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。