¿Hay una función en la que utiliza la búsqueda binaria, como lower_bound
pero que devuelve el elemento últimamenos-que-o-igual-a según un predicado dado?<algorithm> función para encontrar último elemento menos-que-o-igual, como límite distinto
lower_bound
se define a:
encuentra la posición de la primera elemento en un rango ordenado que tiene un valor mayor que o equivalente a un valor especificado, donde el criterio de ordenación puede ser especificado por un predicado binario.
y upper_bound
:
encuentra la posición de la primera elemento en un rango ordenado que tiene un valor que es mayor que un valor especificado, donde el criterio de ordenación puede ser especificado por un predicado binario
Específicamente, tengo un contenedor de eventos ordenados por tiempo y por un tiempo dado quiero encontrar el último elemento que venía antes o en ese momento. ¿Puedo lograrlo con alguna combinación de límite superior/inferior, iteradores inversos y usando std::greater
o std::greater_equal
?
EDIT: un pellizco se necesitaba para la sugerencia de user763305 para hacer frente a si pide un punto antes del comienzo de la matriz:
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 una advertencia sobre el uso de un comparador diferente - usted * debe * usar el mismo comparador (o uno lógicamente equivalente) al que el rango fue ordenado, de lo contrario los algoritmos de búsqueda binarios tienen un comportamiento indefinido. Entonces, si quisieras usar 'std :: greater' primero tendrías que invertir el rango o usar un iterador inverso sobre él. Y nunca se puede usar 'std :: greater_equal' como un comparador porque no es un orden débil estricto. –