gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:03:51 26 4
gpt4 key购买 nike

我经常发现自己将 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com