Te traemos el resultado a esta aprieto, o por lo menos eso pensamos. Si tienes dudas coméntalo, que para nosotros será un gusto responderte
Solución:
En un contenedor ordenado, el último elemento que es menor o equivalente a x
es el elemento antes del primer elemento que es mayor que x
.
Así puedes llamar std::upper_bound
y disminuya una vez el iterador devuelto. (Antes de decrementar, por supuesto, debe verificar que no sea el iterador de inicio; si lo es, entonces no hay elementos que sean menores o equivalentes a x
.)
Aquí hay una función contenedora alrededor de upper_bound que devuelve el número más grande en un contenedor o array que es menor o igual a un valor dado:
template
ForwardIterator largest_less_than_or_equal_to ( ForwardIterator first,
ForwardIterator last,
const T& value)
ForwardIterator upperb = upper_bound(first, last, value);
// First element is >, so none are <=
if(upperb == first)
return NULL;
// All elements are <=, so return the largest.
if(upperb == last)
return --upperb;
return upperb - 1;
Para obtener una mejor explicación de lo que está haciendo y cómo usar esta función, consulte:
C++ STL — Encuentra el último número menor o igual a un elemento dado en un array o contenedor
He probado su solución de iterador inverso, es correcta.
Dado v
está ordenado por '<'
Encuentra el último elemento menor que x:
auto iter = std::upper_bound(v.rbegin(), v.rend(), x, std::greater());
if(iter == v.rend())
std::cout<<"no found";
else
std::cout<<*iter;
Encuentre el último elemento menor que igual a x:
auto iter = std::lower_bound(v.rbegin(), v.rend(), x, std::greater());
if(iter == v.rend())
std::cout<<"no found";
else
std::cout<<*iter;
esto es mejor que iter -= 1
versión
Sección de Reseñas y Valoraciones
Si para ti ha sido útil este post, sería de mucha ayuda si lo compartieras con más seniors y nos ayudes a dar difusión a esta información.