2009-12-23 11 views
17

Utilizando STL, quiero encontrar la última instancia de un cierto valor en una secuencia.¿Hay un algoritmo STL para encontrar la última instancia de un valor en una secuencia?

En este ejemplo encontrará primera instancia de 0 en un vector de ints.

#include <algorithm> 
#include <iterator> 
#include <vector> 

typedef std::vector<int> intvec; 
intvec values; 
// ... ints are added to values 
intvec::const_iterator split = std::find(values.begin(), values.end(), 0); 

Ahora puedo utilizar split a hacer cosas para los sub-intervalos begin() .. split y split .. end(). Quiero hacer algo similar, pero con el conjunto dividido en la última instancia de 0. Mi primer instinto fue utilizar iteradores inversos.

intvec::const_iterator split = std::find(values.rbegin(), values.rend(), 0); 

Esto no funciona porque split es el tipo incorrecto de iterador. Así que ...

intvec::const_reverse_iterator split = std::find(values.rbegin(), values.rend(), 0); 

Pero el problema ahora es que no puedo hacer "cabeza" y "cola" rangos como begin(), split y split, end() porque aquellos que no están invertidas iteradores. ¿Hay alguna manera de convertir el iterador inverso al correspondiente iterador directo (o de acceso aleatorio)? ¿Hay una mejor manera de encontrar la última instancia de un elemento en la secuencia para que me quede un iterador compatible?

Respuesta

23

Pero el problema ahora es que yo no puedo hacer "cabeza" y "cola" rangos usando begin() y al final(), porque esos no son iteradores inversa.

reverse_iterator::base() es lo que busca - sección nuevos miembros en SGIs reverse_iterator description o here on cppreference.com

+0

Excelente. ¡Gracias! –

+1

Tenga en cuenta que 'reverse_iterator :: base()' no apunta al mismo elemento, sino al elemento después del elemento encontrado. Scott Meyer lo expresó mejor en la directriz 3 de este artículo: http://www.ddj.com/cpp/184401406 – AFoglia

+1

[std :: reverse_iterator :: base] (http://en.cppreference.com/w/cpp/ entrada iterator/reverse_iterator/base) en cppreference – maxschlepzig

6

¿Qué hay de std::find_end? (Para encontrar la última aparición de una secuencia)

+1

+1 para un enfoque interesante. Buscar la última subsecuencia de un elemento ciertamente funcionaría. Pero convertir el iterador inverso a su tipo base es más eficiente. –

Cuestiones relacionadas