min_element是否有一个采用投影函数的变体

Is there a variant of min_element which takes a projection function?

本文关键字:函数 投影 element 是否 有一个 min      更新时间:2023-10-16

std::min_element将返回由operator<(T,T)或自定义谓词bool Pred(T,T)定义的最小元素。是否有类似的函数返回投影函数f(T)->R取最小值的元素?

显然,我可以定义bool Pred(t1,t2) { return f(t1) < f(t2); },但当f是lambda时,这有点不方便。

为什么不使用Boost.Iterator库中的boost::transform_iterator(以前称为projection_iterator_adaptor

auto Pred = [](some_value_type const& x){ /* your lambda here */ };
auto result = std::min_element(
    boost::make_transform_iterator(begin(container), Pred),    
    boost::make_transform_iterator(end(container), Pred)
).base(); 
//^^^^^^^  <-- to get back an iterator to the original sequence

与编写特殊的较少谓词相比,这种方法的优势在于,您可以将这种方法用于所有其他算法(例如,对于std::max_element,您需要一个特殊的较大谓词等)。

为什么不定义一个谓词生成器less_by,它接受lambda,返回一个为您完成任务的函子?

template <typename Proj>
struct less_by_t {
    Proj p;
    template <typename T>
    bool operator ()(T const& a, T const& b) const {
        return p(a) < p(b);
    }
};
template <typename Proj>
less_by_t<Proj> less_by(Proj p) {
    return {p};
}
auto result = std::min_element(begin, end, less_by([](T const& x){return …;}));