Idiomatic C++ for remove_if
Idiomatic C++ for remove_if
我有这个类
class Point2D
{
public:
bool isValid();
// ...
private:
double x_, y_;
};
我有一个std::vector< Point2D >
,我想删除无效点,现在我喜欢这样:
bool invalid ( const Point2D& p )
{
return !p.isValid();
}
void f()
{
std::vector< Point2D > points;
// fill points
points.erase( std::remove_if( points.begin(), points.end(), invalid ), points.end() );
// use valid points
}
有没有一种标准的方法(漂亮地)做到这一点,例如不需要"复制"类方法Point2D::isValid
的功能?
也许使用C++11 lambda(我对lambda不是很熟悉)?
试试这个:
points.erase(std::remove_if(points.begin(),
points.end(),
std::not1(std::mem_fun_ref(&Point2D::isValid))),
points.end());
不是完全标准的,但几乎:您可以使用boost::bind并执行以下
points.erase( std::remove_if( points.begin(), points.end(),
!boost::bind(&Point2D::isValid, _1 )), points.end() );
顺便说一下,您应该声明isValid方法const。
lambda版本也不会更干净,但它有另一个重要优势:locality。你可以在使用它的地方看到代码:
points.erase( std::remove_if( points.begin(), points.end(),
[](const Point2D& p){
return !p.isValid();
}), points.end() );
请注意,您需要更改isValid
使其成为const
函数,否则您不能在对const(const Point2D&
)的引用上调用它
另一种选择是为您的类实现operator!
:
class Point2D{
// ... as before
public:
bool isValid() const;
bool operator!() const{
return !isValid();
}
};
请注意,这两个函数都是常量。现在您可以实现一个通用的否定函子:
struct negate{
template<class T>
bool operator()(T const& t){
return !t;
}
};
使用它:
points.erase( std::remove_if( points.begin(), points.end(), negate()), points.end() );
您可以使用std::mem_fun_ref
和std::not1
:的组合来执行您想要的操作
points.erase( std::remove_if( points.begin(), points.end(),
std::not1( std::mem_fun_ref( &Point2D::isValid ) ) ),
points.end() );
值得一提的是,这其中唯一"惯用"的部分是擦除-删除习语。
如果Boost对您来说还可以,请将@Randall-Flagg的建议与boost::remove_erase_if
:一起使用
boost::remove_erase_if(points, !boost::bind(&Point2D::isValid, _1));
我想您正在寻找not1
编辑:仔细看你的例子,我认为你不能用任何其他方式来做,因为isValid()
是一个成员函数。
相关文章:
- 我的简单if-else语句是如何无法访问的代码
- 使用函数"remove"删除重复元素
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何删除peer if else分支中的冗长句子
- 链表的泛型函数remove()与成员函数remove)
- 我似乎对if/else的基本语句有问题:/
- if数组上的随机数
- 将按位if条件转换为普通if条件
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 使用if-else将数字转换为单词
- 为什么简单的算术减法在"if"条件下不起作用?