我经常发现自己将 std::sort
、std::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)); }
关于c++ - 将成员指针作为比较器/"key"的 std 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23596840/