Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 509 — #547<br />
✐<br />
16.7. Introducción a los iteradores<br />
template T* Stack::pop() {<br />
if(head == 0) return 0;<br />
T* result = head->data;<br />
Link* oldHead = head;<br />
head = head->next;<br />
delete oldHead;<br />
return result;<br />
}<br />
#<strong>en</strong>dif // TSTACK2_H ///:~<br />
Hay que hacer notar que la clase ha sido cambiada para soportar la posesión,<br />
que funciona ahora debido a que la clase conoce ahora el tipo exacto (o al m<strong>en</strong>os<br />
el tipo base, que funciona asumi<strong>en</strong>do que son usados los destructores virtuales). La<br />
opción por defecto es que el cont<strong>en</strong>edor destruya sus objetos pero nosotros somos<br />
responsables de los objetos a los que se haga pop().<br />
El iterador es simple, y físicam<strong>en</strong>te muy pequeño - el tamaño de un único puntero.<br />
Cuando se crea un iterator, se inicializa a la cabeza de la lista <strong>en</strong>lazada, y<br />
sólo puede ser increm<strong>en</strong>tado avanzando a través de la lista. Si se quiere empezar<br />
desde el principio, hay que crear un nuevo iterador, y si se quiere recordar un punto<br />
de la lista, hay que crear un nuevo iterador a partir del iterador exist<strong>en</strong>te que está<br />
apuntando a ese elem<strong>en</strong>to (usando el constructor de copia del iterador).<br />
Para llamar a funciones del objeto refer<strong>en</strong>ciado por el iterador, se puede usar<br />
la función curr<strong>en</strong>t(), el operator*, o la desrefer<strong>en</strong>cia de puntero operator--<br />
> (un elem<strong>en</strong>to común <strong>en</strong> los iteradores). La última ti<strong>en</strong>e una implem<strong>en</strong>tación que<br />
parece idéntica a curr<strong>en</strong>t() debido a que devuelve un puntero al objeto actual,<br />
pero es difer<strong>en</strong>te porque el operador desrefer<strong>en</strong>cia del puntero realiza niveles extra<br />
de desrefer<strong>en</strong>ciación (ver Capítulo 12).<br />
La clase iterator sigue el formato que se vio <strong>en</strong> el ejemplo anterior. class<br />
iterator está anidada d<strong>en</strong>tro de la clase cont<strong>en</strong>edora, conti<strong>en</strong>e constructores<br />
para crear un iterador que apunta a un elem<strong>en</strong>to <strong>en</strong> el cont<strong>en</strong>edor y un iterador<br />
«marcador de final», y la clase cont<strong>en</strong>edora ti<strong>en</strong>e los métodos begin() y <strong>en</strong>d(-<br />
) para producir estos iteradores. (Cuando apr<strong>en</strong>da más de la Librería Estándar de<br />
<strong>C++</strong>, verá que los nombres iterator, begin() y <strong>en</strong>d() que se usan aquí ti<strong>en</strong><strong>en</strong><br />
correspondecia <strong>en</strong> las clases cont<strong>en</strong>edoras. Al final de este capítulo, se verá que esto<br />
permite manejar estas clases cont<strong>en</strong>edoras como si fueran clases de la STL).<br />
La implem<strong>en</strong>tación completa se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> el archivo cabecera, por lo que no<br />
existe un archivo cpp separado. Aquí t<strong>en</strong>emos un pequeño test que usa el iterador.<br />
//: C16:TStack2Test.cpp<br />
#include "TStack2.h"<br />
#include "../require.h"<br />
#include <br />
#include <br />
#include <br />
using namespace std;<br />
int main() {<br />
ifstream file("TStack2Test.cpp");<br />
assure(file, "TStack2Test.cpp");<br />
Stack textlines;<br />
// Read file and store lines in the Stack:<br />
string line;<br />
509<br />
✐<br />
✐<br />
✐<br />
✐