may 22, 2010

Enviado por en Algoritmos, C/C++, Programacion

¿Cómo iterar en sentido contrario?

Respuesta: reverse_iterator

Lo puedes conseguir en la librería STL, bajo la cabezera <iterator>. Es una función que retorna un adaptador sobre un iterador. Su uso es práctico, pero tal vez no intuitivo, al menos no para mí. Digamos que queremos iterar en reversa con for_each() un arreglo tal como el siguiente.

int arr[10] = { 0, 1, 4, 7, 8, 3, 16, 3, 9, 11 };

Podemos hacerlo con:

for_each(reverse_iterator<int *>(arr + 10), reverse_iterator<int *>(arr), foo);

Notar que el iterador de inicio corresponde lo que en el sentido original seria el iterador final y viceversa. De hecho, podríamos decir que lo siguiente es cierto:

v.rbegin() = reverse_iterator<vector<int>::iterator>(v.end());
v.rend() = reverse_iterator<vector<int>::iterator>(v.begin());

Siendo v un vector de enteros cualquiera. El punto es que reverse_iterator(it) representa a (it – 1), no a v como tal. Esta característica simplifica el código. El T de los parámetros de la plantilla corresponde al tipo de iterador original. Entonces, que tal si quieres saber si un texto es palíndrome, puedes intentar lo siguiente:

char * word = "PALABRA", * word_end = word + strlen(word);
if (equal(word, word_end, reverse_iterator<char *>(word_end)))
	cout << "Es palíndrome" << endl;
else
	cout << "No es palíndrome" << endl;

    Posts Relacionados

    1. de igual forma para chars se usaría con std::string para comparar

      string s;

      string(s.rbegin(), s.rend()) == s

      Usando Firefox 3.6.3 Firefox 3.6.3 en Windows Vista Windows Vista

    Dejar una respuesta

    Debes ser Alojarse para enviar un comentario.