Questa domanda è ispirata da another topic che pone questa domanda:Come posso far funzionare insieme std :: find_if e std :: map usando una libreria boost?
Trova il primo valore maggiore del valore specificato dall'utente da un contenitore di carta
che può essere risolto in diversi modi. Una tipica soluzione C++ 03 definisce una funzione dedicata (o un functor) e la passa a std::find_if
come terzo argomento.
In C++ 11, si può evitare che definisce un dedicato funzione (o funtore), e possono invece utilizzare lambda
come:
auto it = std:: find_if(m.begin(), mp.end(),
[n](const std::pair<std::string, int> & x) -> bool
{ return x.second > n; }
);
che è the accepted answer.
Sto ancora cercando una soluzione breve e interessante. Se fosse un vettore, allora ho appena appreso una soluzione fresca che fa uso di Boost.Phoenix
e la soluzione diventa molto conciso (ideone demo):
std::vector<int> v = ...;
auto it = std::find_if(v.begin(), v.end(), arg1 > 4);
Ecco arg1
è un oggetto funtore definito boost::phoenix::arg_names
namespace, e l'espressione arg1>4
valuta un altro functor che viene passato a std::find_if
.
Un test rapido è (ideone),
std::cout<< (arg1 > 9)(v) << std::endl; //prints 0 if as v > 9 is false, else 1
//or store the functor first and then use it
const auto & f = arg1 > 9;
std::cout<< f(v) << std::endl; //prints 0 if as v > 9 is false, else 1
La mia domanda è, voglio risolvere il problema carta, in modo simile. C'è una soluzione del genere? Qualcosa di simile:
auto it = std::find_if(m.begin(),mp.end(), (???).second > n); //m is std::map
Oppure,
auto it = std::find_if(m.begin(),mp.end(), at<1>(arg1) > n); //m is std::map
Per farlo funzionare, l'espressione at<1>(arg1) > 2
deve valutare ad un funtore che prende const std::pair &
come argomento. I miei sentimenti istintivi mi dicono che boost ha questa soluzione. :-)
Vuoi trovare solo i valori (in cui http caso: // www.boost.org/doc/libs/release/libs/range/doc/html/range/reference/adaptors/reference/map_values.html è la risposta) o l'iteratore dell'intera chiave, coppia di valori in cui il valore ha soddisfatto il predicato ? – Cubbi
@Cubbi: Questa non è la risposta se non funziona con 'std :: find_if' che restituisce un iteratore della mappa. – Nawaz
@Nawaz: non so se std :: find_if è richiesto. In caso contrario, andrei con http://www.cplusplus.com/reference/stl/map/upper_bound/ che dovrebbe essere più veloce e solo una semplice riga di codice. –