recorrer que libreria iteradores iterador ejemplos contenedoras clases c++ sorting iterator

c++ - que - Obtenga un iterador inverso de un iterador directo sin conocer el tipo de valor



que es un iterador en java (2)

Estoy tratando de implementar algunos algoritmos de clasificación estilo STL. El prototipo de std::sort ve así (de cplusplus.com ):

template <class RandomAccessIterator> void sort ( RandomAccessIterator first, RandomAccessIterator last );

La función generalmente se llama así (aunque el tipo de contenedor puede variar):

std::vector<int> myVec; // Populate myVec std::sort(myVec.begin(), myVec.end());

Dupliqué el prototipo de std::sort para mi propia función de clasificación. Para iterar a través del contenedor que se ordenará, hago lo siguiente:

template <class RandomAccessIterator> void mySort(RandomAccessIterator first, RandomAccessIterator last) { RandomAccessIterator iter; for (iter = first; iter != last; ++iter) { // Do stuff } }

Suficientemente fácil. Pero, ¿y si quiero usar un iterador inverso? Esto sería conveniente en los algoritmos que ordenan un contenedor de ambos extremos, por ejemplo, tipo de cóctel .

¿Hay alguna forma de obtener un iterador inverso de los iteradores que se pasan como parámetros? Si supiera el tipo de contenedor por adelantado, podría hacer algo como esto:

template <class RandomAccessIterator> void mySort(RandomAccessIterator first, RandomAccessIterator last) { std::vector<int>::reverse_iterator riter(last); std::vector<int>::reverse_iterator rend(first); for ( ; riter != rend; ++riter) { // Do stuff } }

Lamentablemente, no conozco el tipo de contenedor. Lo que realmente necesito hacer es algo como esto:

template <class RandomAccessIterator> void mySort(RandomAccessIterator first, RandomAccessIterator last) { RandomAccessIterator riter = reverse_iterator(last); RandomAccessIterator rend = reverse_iterator(begin); for ( ; riter != rend; ++riter) { // Do stuff } }

¿Hay alguna forma de hacerlo sin tener que pasar iteradores inversos como parámetros adicionales (lo que resolvería el problema, pero haría que el prototipo de la función sea menos intuitivo)?

Tenga en cuenta que necesito iteradores directos e inversos en mi implementación, por lo que llamar a la función de esta manera

std::vector<int> myVec; // Populate myVec mySort(myVec.rbegin(), myVec.rend());

no trabajará.


El STL tiene std::reverse_iterator<Iterator> :

template <class RandomAccessIterator> void mySort(RandomAccessIterator first, RandomAccessIterator last) { typedef std::reverse_iterator<RandomAccessIterator> RIter; RIter riter(last); RIter rend(first); for ( ; riter != rend; ++riter) { // Do stuff } }

Una nota importante :

Sin embargo, tenga en cuenta que cuando se invierte un iterador, la versión invertida no apunta al mismo elemento en el rango, sino al que le precede. Esto es así, para organizar el elemento pasado de un rango: un iterador que apunta a un elemento pasado-al-fin en un rango, cuando se invierte, se cambia para apuntar al último elemento (no más allá de él) ) del rango (este sería el primer elemento del rango si se invierte). Y si se invierte un iterador del primer elemento de un rango, el iterador invertido apunta al elemento anterior al primer elemento (este sería el elemento pasado del rango si se invierte).


Mira el método base () de reverse_iterator.