以成员指针为比较器/“键”的STD算法

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

我经常发现自己std::sortstd::max_element,以及类似的方法,即只调用一个成员函数的lambda。

std::vector<MyType> vec;
// populate...
auto m = std::max_element(std::begin(vec), std::end(vec),
    [](const MyType& a, const MyType& b) { return a.val() < b.val()})

可以编写另一个函数/可调用对象,并将一个函数指针/可调用对象传递给这些算法函数,在一个程序中只执行一次,这并不是解决问题的好方法。理想情况下,我想做的是:

auto m = std::max_element(std::begin(vec), std::end(vec), &MyType::val);

并让对象按它们的val()S。我忽略的stdlib中有什么地方可以帮助我吗?还是另一种简单的方法?我想把这是排序还是搜索尽可能的清楚。

我知道&MyType::val这还不够,我正在寻找一些东西,也许可以包装它,或者提供类似的功能,而不去纠结它的含义。

提问于
用户回答回答于

你可以用std::mem_fn(或std::tr1::mem_fn)

int main()
{
    std::vector<MyType> vec;

    auto m = std::max_element(std::begin(vec), std::end(vec), compare_by(std::mem_fn(&MyType::field)));
}

当然,这假设有一个实用程序,如compare_by在工具箱中:

template <typename F>
struct CompareBy {
    explicit CompareBy(F&& f) : f(std::forward<F>(f)) {}
    template <typename U, typename V> 
        bool  operator()(U const& u, V const& v) const {
            return f(u) < f(v);
        }

private:
    F f;
};

template <typename F>
CompareBy<F> compare_by(F&& f) { return CompareBy<F>(std::forward<F>(f)); }
用户回答回答于

可以引入任何新功能(模板化与否)。

使用bindstd::less

auto m = std::max_element(vec.begin(), vec.end(), 
    bind(less<>(), bind(&MyType::val, _1), bind(&MyType::val, _2)));

扫码关注云+社区