【问题标题】:std::remove_if usage in C++98C++98 中的 std::remove_if 用法
【发布时间】:2014-10-18 17:23:49
【问题描述】:

我一直在寻找一种在迭代时擦除向量中某些元素的智能方法,结果发现了this question

当然,它对我不起作用,因为 C++98 没有 lambda。查找 remove_if 信息并找到 this at cppreference。这就是我的代码的样子:

#include <algorithm>
#include <vector>

bool isOutageValid(const Outage& outage){
    return outage.getEndTime() >= 0;
}

std::vector<Outage> outages;
// Some stuff to fill the vector

outages.erase(std::remove_if(outages.begin(), outages.end(), isOutageValid));

for(vector<Outage>::iterator o=outages.begin(); o!=outages.end(); o++){
    std::cout << o->getStartTime() << " " << o->getEndTime() << std::endl;
}

我正在调试一个向量,其中有 4 个中断,我知道第一个是无效的,其余的都是有效的。执行擦除后,向量大小为3,所以看起来还可以。但是,如果我使用 for 循环来检查向量中的 3 个中断,则第二个已被删除,而不是第一个。

我什至调试了 isOutageValid 方法,它是第一个返回 false 的唯一方法。有没有我遗漏的错误?

【问题讨论】:

  • 你的意思是 outages.begin(),对吧?

标签: c++ vector c++98


【解决方案1】:

应该是:

outages.erase(std::remove_if(outages.begin, outages.end(), isNotOutageValid), outages.end());

目前,您的分区中断首先无效,最后有效(换句话说,您的谓词被反转)。
然后删除第一个有效元素(而不是范围)。

【讨论】:

  • +1 我被咬了不止一次,因为我漏掉了第二个, outages.end()...
【解决方案2】:

1.您忘记指定erase的第二个参数,即被擦除范围的结束:

outages.erase(std::remove_if(outages.begin, outages.end(), isOutageValid), outages.end());

2.条件无效,你应该否定它:

 #include <functional>

 outages.erase(std::remove_if(outages.begin, outages.end(), std::not1(std::ptr_fun(&isOutageValid))), outages.end());

【讨论】:

  • +1 我被咬了不止一次,因为我漏掉了第二个, outages.end()...
猜你喜欢
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
  • 1970-01-01
相关资源
最近更新 更多