std::remove_if在c++中的用法

std::remove_if usage in C++98

本文关键字:用法 c++ if remove std      更新时间:2023-10-16

我正在寻找一种巧妙的方法,在迭代时擦除向量中的一些元素,并发现了这个问题。

当然,它不会为我工作,因为c++ 98没有lambdas。查找remove_if info并在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个Outages,则第二个已被擦除,而不是第一个。

我甚至调试了isOutageValid方法,它是第一个也是唯一一个返回false的方法。我错过了什么错误吗?

应该是:

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

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

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