2013-07-18 8 views
8

std::min_element zwróci najmniejszy element zdefiniowany przez operator<(T,T) lub niestandardowy predykat bool Pred(T,T). Czy istnieje podobna funkcja, która zwraca element, dla którego funkcja projekcji f(T)->R przyjmuje wartość minimalną?Czy istnieje wariant min_element, który przyjmuje funkcję projekcji?

Oczywiście mogę zdefiniować bool Pred(t1,t2) { return f(t1) < f(t2); }, ale to trochę niewygodne, gdy f jest lambda.

+2

Obliczyć pochodną "f". * Ok ok Wiem, że to był kiepski dowcip * –

+0

Ale kiedy banki korzystały z instrumentów pochodnych, spowodowało to kryzys finansowy _Nawsze gorszy żart: P – MSalters

+1

Jeśli 'f' jest lambdą, możesz przekazać go do C++ 1y wyższego rzędu polimorficzna lambda '[] (auto f) {return [] (auto t1, auto t2) {return f (t1) Potatoswatter

Odpowiedz

4

Dlaczego po prostu nie zdefiniować generatora predykatów less_by, który, biorąc lambda, zwraca funktor, który wykonuje pracę dla ciebie?

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 …;})); 
4

Dlaczego nie użyć boost::transform_iterator (co zwykło się nazywać projection_iterator_adaptor) od Boost.Iterator library

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 

Zaletą tego na piśmie specjalnej mniej predykatu są, które można ponownie wykorzystać to podejście dla wszystkich innych algorytmów (np. dla std::max_element potrzebujesz specjalnego większego predykatu itp.).

Powiązane problemy