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)