C ++ 98中的std :: remove_if用法

时间:2014-08-25 14:17:10

标签: c++ vector c++98

我正在寻找一种在迭代时擦除矢量中某些元素的智能方法,并找到了this question

当然,它不适合我,因为C ++ 98没有lambda。查找remove_if信息并找到this at cppreferenc e。所以这就是我的代码的样子:

#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的方法。我有什么错误吗?

2 个答案:

答案 0 :(得分:7)

应该是:

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

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

答案 1 :(得分:4)

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());
相关问题