C'è una funzione in che utilizza la ricerca binaria, come lower_bound
ma che restituisce l'elemento ultimameno-che-o-uguale-a in base a un determinato predicato?<algorithm> funzione per la ricerca di ultimo elemento di meno-che-o-uguale, come lower_bound
lower_bound
è definito da:
trova la posizione del primo elemento in un intervallo ordinata che ha un valore superiore o equivalente a un valore specificato, dove può essere specificato il criterio d'ordine da un predicato binario.
e upper_bound
:
trova la posizione del primo elemento in un intervallo ordinata che ha un valore che è superiore un valore specificato, in cui il criterio di ordinamento può essere specificato da un predicato binario.
In particolare, ho un contenitore di eventi ordinati nel tempo e per un determinato periodo di tempo voglio trovare l'ultimo elemento che è venuto prima o in quel punto. Posso ottenere questo risultato con una combinazione di limiti superiori/inferiori, iteratori inversi e utilizzando std::greater
o std::greater_equal
?
EDIT: un tweak era necessario per il suggerimento di user763305 per far fronte a se chiedete un punto prima dell'inizio della matrice:
iterator it=upper_bound(begin(), end(), val, LessThanFunction());
if (it!=begin()) {
it--; // not at end of array so rewind to previous item
} else {
it=end(); // no items before this point, so return end()
}
return it;
Solo un avvertimento sull'utilizzo di un comparatore diverso - si * deve * usare lo stesso comparatore (o uno logicamente equivalente) a quello con cui è stato ordinato l'intervallo, altrimenti gli algoritmi di ricerca binaria hanno un comportamento indefinito. Quindi se si volesse usare 'std :: greater' si dovrebbe invertire la gamma o usare un iteratore inverso su di esso. E non puoi mai usare 'std :: greater_equal' come comparatore perché non è un ordine debole. –