有没有办法用 std::function 而不是结构调用 std::equal_range ?

问题描述

在下面的示例中,创建了一个 struct Comp。有没有办法使它成为 std::function 或在调用 std::equal_range 时编写比较器本身?我可以去掉 struct 吗?

struct Comp
{
    bool operator() ( const S& s,int i ) const { return s.number < i; }
    bool operator() ( int i,const S& s ) const { return i < s.number; }
};
     
const auto p2 = std::equal_range(vec.begin(),vec.end(),2,Comp{});

解决方法

您可以使用 boost::hana::overload 来重载 lambda:

    auto constexpr comp = boost::hana::overload(
        []( const S& s,int i ) { return s.number < i; },[]( int i,const S& s ) { return i < s.number; }
    );

    const auto p2 = std::equal_range(vec.begin(),vec.end(),2,comp);

显然,您可以将整个 boost::hana::overload(…) 内容放在对 std::equal_range 的调用中,但它只会降低代码的可读性,恕我直言。

但是,我要强调的是,无论您是否自己编写,最终都可能使用 struct/class;例如std::function 是模板化的 classboost::hana::overload 是给定 class 的对象,依此类推。

由于您尚未指定标准,因此可能使用 Jeff Garrett 解决方案是可行的方法(尽管我会将 vec.begin(), 更改为 vec,,如果您要处理整个 {{1 }})。如果您必须符合 C++17,则可以使用 Range-v3:

vec

这也适用于 C++14,只要您不依赖于 CTAD

#include <range/v3/algorithm/equal_range.hpp>
// ...
const auto p2 = ranges::equal_range(vec,std::less{},[](const S& s) { return s.number; });
,

范围版本支持投影:

std::ranges::equal_range(vec.begin(),[](const S& s) { return s.number; });

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...