std算法,指向成员的指针作为比较器/"键"

Rya*_*ing 18 c++ algorithm pointer-to-member c++11

我经常发现自己使用std::sort,std::max_element以及与简单地调用成员函数拉姆达等等

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()})
Run Code Online (Sandbox Code Playgroud)

这感觉就像是浪费角色和失去清晰度.我知道我可以编写另一个函数/可调用函数并将函数指针/可调用对象传递给这些算法函数,但我经常需要在程序中执行此类操作,并且它不会让我感觉良好解决问题的方法.我想做什么,理想情况是说:

auto m = std::max_element(std::begin(vec), std::end(vec), &MyType::val);
Run Code Online (Sandbox Code Playgroud)

并按对象对对象进行排序val().我有什么部分stdlib可以帮助我解决这个问题吗?或另一种简单的方法吗?我想尽可能明显地进行排序或搜索.

我知道这&MyType::val还不够,我正在寻找可以包装它的东西,或提供类似的功能而不会妨碍其含义.

seh*_*ehe 16

你可以用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)));
}
Run Code Online (Sandbox Code Playgroud)

当然,这假设你有一个像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)); }
Run Code Online (Sandbox Code Playgroud)

看到Live On Coliru

  • 在这里转发是荒谬的.移动不会增加任何效率*什么都不做*这是你通过引用传递时得到的.此前C++ 11版本中没有副本.你为什么要添加动作? (3认同)
  • 好吧,这是一个有价值的选择,但(@Ryan)请告诉我为什么这应该比单线lambda更好? (2认同)