c++ - 将成员指针作为比较器/"key"的 std 算法

标签 c++ algorithm c++11 pointer-to-member

我经常发现自己将 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() 排序。我忽略的标准库的某些部分是否可以帮助我解决这个问题?或另一种简单的方法?我想让排序或搜索的内容尽可能明显。

我知道仅仅 &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)); }

Live On Coliru

关于c++ - 将成员指针作为比较器/"key"的 std 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23596840/

相关文章:

c++ - 链接器错误 |收集 2 : error: ld returned 1 exit status

Android NDK制作。数百个 "undefined reference error"秒

c++ - 使用 std::fstream 从文件读取和追加文件

c++ - 计算模式最大值

java - 混合两个数组

c++ - 使用提示将排序范围插入 std::set

c++ - isspace() 仅适用于最多 8 位数字?

algorithm - 是 MST 中相邻的最轻边

c# - 多个客户端之间的对象同步算法

c++ - 将 std::bind 与重载函数一起使用