是否存在min_element的变体,它具有投影功能?

MSa*_*ers 8 c++ algorithm iterator projection c++11

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

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

Tem*_*Rex 5

为什么不使用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
Run Code Online (Sandbox Code Playgroud)

这种优于编写特殊的较少谓词的优点是,您可以将此方法重用于所有其他算法(例如,std::max_element您需要一个特殊的更高谓词等).


Kon*_*lph 4

为什么不直接定义一个谓词生成器less_by,它采用 lambda,返回一个为您完成工作的函子呢?

\n\n
template <typename Proj>\nstruct less_by_t {\n    Proj p;\n\n    template <typename T>\n    bool operator ()(T const& a, T const& b) const {\n        return p(a) < p(b);\n    }\n};\n\ntemplate <typename Proj>\nless_by_t<Proj> less_by(Proj p) {\n    return {p};\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n\n\n
auto result = std::min_element(begin, end, less_by([](T const& x){return \xe2\x80\xa6;}));\n
Run Code Online (Sandbox Code Playgroud)\n