std::remove_if在c++中的用法
std::remove_if usage in C++98
我正在寻找一种巧妙的方法,在迭代时擦除向量中的一些元素,并发现了这个问题。
当然,它不会为我工作,因为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());
相关文章:
- 这个指针在c++中的用法
- 当C++中需要自动删除时,这是静态的正确用法吗?
- libstdc++ 文件系统中未初始化的用法?
- 复制和交换习惯用法与移动操作之间的交互
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 命名参数习惯用法和(抽象)基类
- 省略号在C++中的所有用法
- () 在 C++ 11 中的特殊而奇怪的用法?
- 构造函数的用法
- 模板类中自动的类用法不完整
- 这里的 = 运算符有什么用法?
- 什么模板用法在阶乘中更好
- 如果可变长度元素的constexpr用法得到<>
- 为什么 setjmp/longjmp 的这种用法是未定义的行为?
- 访问提升:shared_ptr 主范围外崩溃,断言失败:px != 0.指针的正确用法是什么?
- C++ 中函数中 Const 用法之间的差异
- equal_to模板类C++用法
- PCL 中的 GICP 用法
- 向量的正确用法<int>::size_type
- C++命名空间的基本用法