35
Clase de Iteradores en C++ Algoritmos y estructuras de datos II Algoritmos y estructuras de datos II  Clase de Itera dor es en C++

Clase de Iteradores

  • Upload
    drw21

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

  • 5/20/2018 Clase de Iteradores

    1/35

    Clase de Iteradores en C++

    Algoritmos y estructuras de datos II

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    http://find/
  • 5/20/2018 Clase de Iteradores

    2/35

    Hasta ahora vimos:

    Clases

    Manejo de memoria dinamica Templates

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    http://find/
  • 5/20/2018 Clase de Iteradores

    3/35

    template< typename T >

    class A r re gl oD {

    T * arreglo ;int e s p a c i o ;

    int u l t i m o ;

    public :

    A r r e g l o D ( ) ;

    A r r e g l o D ( int t a ma n io ) ;

    A r r e g l o D ( const A r re g l oD < T > & o t r o A r re g l o ) ;~ A r r e g l o D ( ) ;

    void i n s e r t a r A t r a s ( const T & el em );

    int t a m a n i o ( ) const ;

    const T & i es im o ( int i ) const ;

    T & i es im o ( int i );

    };

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    http://find/
  • 5/20/2018 Clase de Iteradores

    4/35

    Iteradores

    Que es un iterador?

    Como los usamos en C++?

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    http://find/
  • 5/20/2018 Clase de Iteradores

    5/35

    Iteradores

    Que es un iterador? Un objeto que permite atravesar un contenedor.

    Como los usamos en C++?

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    http://find/
  • 5/20/2018 Clase de Iteradores

    6/35

    Iteradores

    Que es un iterador? Un objeto que permite atravesar un contenedor. En general mantienen una interfaz comun y ocultan los

    detalles de la estructura que iteran.

    Como los usamos en C++?

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    http://find/
  • 5/20/2018 Clase de Iteradores

    7/35

    Iteradores

    Que es un iterador? Un objeto que permite atravesar un contenedor. En general mantienen una interfaz comun y ocultan los

    detalles de la estructura que iteran.

    Como los usamos en C++? En C++ los contenedores iterables contienen una clase interna

    llamadaiterator y metodos para obtener una instancia queitere a partir de algun punto.

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    http://find/
  • 5/20/2018 Clase de Iteradores

    8/35

    Iteradores

    Que es un iterador? Un objeto que permite atravesar un contenedor. En general mantienen una interfaz comun y ocultan los

    detalles de la estructura que iteran.

    Como los usamos en C++? En C++ los contenedores iterables contienen una clase interna

    llamadaiterator y metodos para obtener una instancia queitere a partir de algun punto.

    El estilo de C++ es levemente distinto al estilo que usamos en

    la materia en los modulos de diseno, en el TP podran utilizarel que les sea mas comodo.

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    http://find/
  • 5/20/2018 Clase de Iteradores

    9/35

    Declarando un iterador a la Algo 2

    template< typename T >

    class A r re gl oD {public :

    ...

    class I t er ad or {

    A r re g l oD < T > * a r r e gl o ;

    int i n d i c e ;

    Iterador( ArregloD * arreglo , int indice);friend I t e r a do r A r re g lo D < T > : : c r e a r I t ( ) ;

    public :

    bool hayMas() const ;

    T & actual ();

    void avanzar();

    };

    I t er a do r c r ea r It ( );

    };

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    http://find/http://goback/
  • 5/20/2018 Clase de Iteradores

    10/35

    Definiendo un iterador a la Algo 2

    template< typename T >

    typename ArregloD :: Iterador

    A r re g l oD < T > : : c r e a r I t ( ) {

    I t er a do r i t (this , 0);

    return it ;}

    template< typename T >

    ArregloD ::Iterador::Iterador(

    A r re g lo D * a , int i ) :

    a r re g lo ( a ) , i n di c e ( i ) { }

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    http://find/
  • 5/20/2018 Clase de Iteradores

    11/35

    Definiendo un iterador a la Algo 2

    template< typename T >

    bool ArregloD :: Iterador ::hayMas () const {

    return i n d i ce < a r re g lo - > t a m a n i o ( ) ;

    }

    template< typename T >

    T & A rr eg lo D < T > :: I t er a do r : : a c t ua l ( ) {

    return arreglo -> iesimo( indice);

    }

    template< typename T >

    void A r re g lo D < T > : : I t e r a d o r : : a v a n z ar ( ) {

    indice++;}

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    http://find/http://goback/
  • 5/20/2018 Clase de Iteradores

    12/35

    Declarando un iterador a la Algo 2

    template< typename T >

    class A r re gl oD {public :

    ...

    class I t e r a do r _ co n s t {

    const A r re g lo D < T > * a r r e gl o ;

    int i n d i c e ;

    I t e r a d o r _ c o n s t ( const ArregloD * arreglo , int indice);friend I t e r a d o r _ co n s t A r re g lo D < T > : : c r e a r I t ( ) const ;

    public :

    bool hayMas() const ;

    const T & a c tu a l ( );

    void avanzar();

    };

    I t e ra d o r_ c o ns t c r ea r It ( ) const ;

    };

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    http://find/
  • 5/20/2018 Clase de Iteradores

    13/35

    Definiendo un iterador a la Algo 2

    template< typename T >typename ArregloD :: Iterador_con st

    ArregloD :: crearIt () const {

    I t e ra d o r_ c o ns t i t (this , 0);

    return it ;

    }

    template< typename T >

    A r re g l oD < T > : : I t e r a d o r _ co n s t : : I t e r a d o r _ c on s t (

    const A r r eg lo D * a , int i ) :

    a r re g lo ( a ) , i n di c e ( i ) { }

    template< typename T >

    const T & A r re g lo D < T > : : I t e r a d o r _ c o n s t : : a c t ua l ( ) {return arreglo -> iesimo( indice);

    }

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    http://find/
  • 5/20/2018 Clase de Iteradores

    14/35

    Ventajas:

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    http://find/
  • 5/20/2018 Clase de Iteradores

    15/35

    Ventajas:

    Permite manipular eficientemente el contenedor manteniendooculta su representacion interna.

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    http://find/
  • 5/20/2018 Clase de Iteradores

    16/35

    Ventajas:

    Permite manipular eficientemente el contenedor manteniendooculta su representacion interna.

    Podemos usar iteradores como punteros seguros a laestructura interna sin exponerla.

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    V

    http://find/
  • 5/20/2018 Clase de Iteradores

    17/35

    Ventajas:

    Permite manipular eficientemente el contenedor manteniendooculta su representacion interna.

    Podemos usar iteradores como punteros seguros a laestructura interna sin exponerla.

    Permite escribir algoritmos genericos (asumiendo una interfazcomun).

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    template < typename T >

    http://find/http://goback/
  • 5/20/2018 Clase de Iteradores

    18/35

    template< typename T >

    class L is ta {

    struct N od o {

    T e le m ;

    N od o * a n te ri or , * s i g u ie n te ;

    Nodo( const T & e , Nodo * ant , Nodo * sig ) :

    e le m ( e ) , a n te r io r ( a n t ) , s i gu i e nt e ( s i g ) { }};

    N od o * c a be z a ;

    public :

    class I t er ad or {

    L is ta < T > * l i st a ;

    N od o * n od o ;

    I t er a do r ( L i s ta * l is ta , N od o * n od o ) ;

    f r ie n d c la s s L i s t a < T > ;

    public :

    I t er a do r i n se r ta r ( const T & e );void remover();

    };

    Lista();

    I t er a do r a g re g ar ( const T & t );

    };Algoritmos y estructuras de datos II Clase de Iteradores en C++

    http://find/http://goback/
  • 5/20/2018 Clase de Iteradores

    19/35

    template< typename T >

    L is ta < T >: : L is ta ( ) : c ab ez a ( N UL L ) { }

    template< typename T >

    typename L i s t a < T > : : I t e r a d o r

    L i s t a < T > : : a g r e g a r ( const T & e )

    {

    c ab ez a = new N o do ( e , NU LL , c ab ez a ) ;

    if ( c a be za - > s i g u ie n te ! = N U LL )

    c a be z a - > s i g u i en t e - > a n t e r i o r = c a b e za ;

    typename L i st a < T > :: I t e r a do r i t (this , c ab ez a ) ;

    return it ;

    }

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    http://find/
  • 5/20/2018 Clase de Iteradores

    20/35

    template< typename T >

    L is ta < T >: : I t er ad or : : I t er ad or ( L is ta < T >* l , N od o * n ) :

    l is ta ( l ) , n od o ( n) { }

    template< typename T >

    typename L i s t a < T > : : I t e r a d o r

    L i s t a < T > : : I t e r a d o r : : i n s e r t a r ( const T & e )

    {

    N od o * n od o = new N od o ( e , n od o , n od o - > s i g ui e nt e ) ;

    if ( n od o - > s i gu ie nt e ! = N UL L )

    n od o - > s i g ui e nt e - > a n t er i or = n od o ;

    n odo - > s i gu ie nt e = n od o ;

    I t er a do r i t ( li st a , n od o ) ;

    return it ;

    }

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    http://find/
  • 5/20/2018 Clase de Iteradores

    21/35

    template< typename T >

    void L i s t a < T > : : I t e r a d o r : : r e m o v e r ( )

    {

    if ( n od o == l is ta - > c ab ez a ) {

    l is ta - > c a b ez a = n od o - > s i g ui e nt e ;

    n od o - > s i g ui e nt e - > a n t er i or = N UL L ;

    } else {

    n od o - > a n te r io r - > s i g u i e n t e = n od o - > s i g u i e n t e ;if ( n od o - > s i gu ie nt e != N UL L )

    n od o - > s i g u i en t e - > a n t e r i o r = n od o - > a n t e r i o r ;

    }

    delete nodo;

    }

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    Iteradores a la C++

    http://find/
  • 5/20/2018 Clase de Iteradores

    22/35

    Iteradores a la C++

    C++, Java, Python y muchos otros lenguajes hace un uso intensivode iteradores, cada uno tiene su propia manera de hacerlos.En C++:

    Los iteradores deben proveer los operadores *, ++, ->, ==y

    otros dependiendo del tipo del iterador. Los objetos iterables usualmente tiene una clase interna

    iterator (y/o const iterator) de forma similar a como lohicimos hasta ahora.

    Los objetos iterables usualmente aceptan los metodosbegin() y end() (y potencialmente rbegin() y rend()).

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    template< typename T >

    http://find/
  • 5/20/2018 Clase de Iteradores

    23/35

    p yp

    class L is ta {

    N od o * c a be z a ;

    N od o * f in ;

    ...

    public :

    class i t er at or {

    L is ta < T > * l i st a ;

    N od o * n od o ;

    bool v a l i d o ;

    ...

    public :

    T & operator *();

    b oo l o p er a to r ==( const L i st a < T > :: i t e r a to r & o tr o ) const ;

    b oo l o p er a to r !=( const L i st a < T > :: i t e r a to r & o tr o ) const ;

    i t e r a t o r & operator ++();

    iterator operator ++( int );

    i t e r a t o r & operator--();iterator operator- -( int );

    };

    i t er a to r b eg i n ( );

    i t er a to r e nd ( ) ;

    };Algoritmos y estructuras de datos II Clase de Iteradores en C++

    template< typename T >

    http://find/
  • 5/20/2018 Clase de Iteradores

    24/35

    p yp

    T & L is ta < T > :: i t er a to r : : operator *() {

    return n o d o - > e l e m ;

    }

    template< typename T >

    typename L is ta < T > : : i t e r a t o r & L is t a < T > : : i t e r a t o r : : operator + +( ) {v al id o = no do - > s i gu ie n te ! = N UL L ;

    if ( v a l i d o )

    n od o = no do - > s i gu i en te ;

    return * this ;

    }

    template< typename T >

    typename L is ta < T > : : i t e r a t o r L is ta < T > : : i t e r a t o r : : operator- -( int ) {

    i t er a to r i t (* this );

    v al id o = no do - > a n te ri or ! = N UL L ;

    if ( v a l i d o )

    n od o = no do - > a n te ri or ;

    return it ;}

    template< typename T >

    bool L i s t a < T > : : i t e r a t o r : : operator ==(

    const L i st a < T > :: i t er a to r & o tr o ) const {

    return v a li do == o tr o . va li do && n od o == o tr o . no do ;

    }Algoritmos y estructuras de datos II Clase de Iteradores en C++

    Algoritmos genericos sobre iteradores en C++

    http://find/
  • 5/20/2018 Clase de Iteradores

    25/35

    Algoritmos genericos sobre iteradores en C++

    El header algorithm tiene definidas un gran numero de funcionescon clases templatizadas asumiendo que cumplen con la interfaz de

    los iteradores. Por lo que cualquier clase que que sigacorrectamente el patron automaticamente tiene todos esosalgoritmos a su disposicion sin necesidad de implementarlos.Ejemplos:

    find count

    replace

    reverse

    sort random shuffle

    min

    max

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    Algoritmo de busqueda de algorithm h

    http://find/
  • 5/20/2018 Clase de Iteradores

    26/35

    Algoritmo de busqueda de algorithm.h

    template< class InputIt erator , class T >

    I np u tI te r at or f in d (

    I n p ut I t er a t or f ir st ,

    I n p ut I t er a t or l as t ,

    const T & va lue ){

    for (; first != last && * first != value ; + + first );

    return first;

    }

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    Tipos de iteradores

    http://find/
  • 5/20/2018 Clase de Iteradores

    27/35

    Tipos de iteradores

    Los iteradores en C++ se separan en distintas categoras, lo quepermite implementar algoritmos genericos de distinta forma para

    cada tipo de iterador:

    1. Input

    2. Output

    3. Forward

    4. Bidirectional

    5. Random access

    Para definir a que categora pertenece un iterador se utilizanmiembros de la clase iterator traits. Esto puede hacerse dedistintas formas, pero usualmente incluye herencia oespecializacion de templates por lo que queda fuera de este curso.

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    Recomendaciones al pasar del diseno a la implementacion

    http://find/
  • 5/20/2018 Clase de Iteradores

    28/35

    Recomendaciones al pasar del diseno a la implementacion

    Por cada modulo hacer una clase y un test.

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    Recomendaciones al pasar del diseno a la implementacion

    http://find/
  • 5/20/2018 Clase de Iteradores

    29/35

    Recomendaciones al pasar del diseno a la implementacion

    Por cada modulo hacer una clase y un test.

    Hacer una clase interna por cada iterador en el modulo (y unaanaloga const si tiene sentido).

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    Recomendaciones al pasar del diseno a la implementacion

    http://find/
  • 5/20/2018 Clase de Iteradores

    30/35

    Recomendaciones al pasar del diseno a la implementacion

    Por cada modulo hacer una clase y un test.

    Hacer una clase interna por cada iterador en el modulo (y unaanaloga const si tiene sentido).

    Recordar que las clases templatizadas no forman unidades decompilacion (ojo con los cpp que no deben compilarse).

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    Recomendaciones al pasar del diseno a la implementacion

    http://find/
  • 5/20/2018 Clase de Iteradores

    31/35

    Recomendaciones al pasar del diseno a la implementacion

    Por cada modulo hacer una clase y un test.

    Hacer una clase interna por cada iterador en el modulo (y unaanaloga const si tiene sentido).

    Recordar que las clases templatizadas no forman unidades decompilacion (ojo con los cpp que no deben compilarse).

    Tener siempre presente el scope de las variables y los objetos.

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    Recomendaciones al pasar del diseno a la implementacion

    http://find/
  • 5/20/2018 Clase de Iteradores

    32/35

    p p

    Por cada modulo hacer una clase y un test.

    Hacer una clase interna por cada iterador en el modulo (y unaanaloga const si tiene sentido).

    Recordar que las clases templatizadas no forman unidades decompilacion (ojo con los cpp que no deben compilarse).

    Tener siempre presente el scope de las variables y los objetos.

    Identificar que cosas deben alocarse en memoria dinamica yque cosas no.

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    Recomendaciones al pasar del diseno a la implementacion

    http://find/
  • 5/20/2018 Clase de Iteradores

    33/35

    p p

    Por cada modulo hacer una clase y un test.

    Hacer una clase interna por cada iterador en el modulo (y unaanaloga const si tiene sentido).

    Recordar que las clases templatizadas no forman unidades decompilacion (ojo con los cpp que no deben compilarse).

    Tener siempre presente el scope de las variables y los objetos.

    Identificar que cosas deben alocarse en memoria dinamica yque cosas no.

    Hacer delete de todo lo que se hace new, pero de nada mas.

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    Recomendaciones al pasar del diseno a la implementacion

    http://find/
  • 5/20/2018 Clase de Iteradores

    34/35

    p p

    Por cada modulo hacer una clase y un test.

    Hacer una clase interna por cada iterador en el modulo (y unaanaloga const si tiene sentido).

    Recordar que las clases templatizadas no forman unidades decompilacion (ojo con los cpp que no deben compilarse).

    Tener siempre presente el scope de las variables y los objetos.

    Identificar que cosas deben alocarse en memoria dinamica yque cosas no.

    Hacer delete de todo lo que se hace new, pero de nada mas.

    LO MAS IMPORTANTE DE TODO ES PROGRAMAR DEFORMA INCREMENTAL. ESCRIBIR UNA FUNCION, SUTEST, COMPILAR Y PROBAR ANTES DE SEGUIR.

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    Ejercicio

    http://find/
  • 5/20/2018 Clase de Iteradores

    35/35

    j

    Implemente una clase Rosetree (un arbol con una cantidad

    arbitraria de hijos) con un iterador preorder a la C++.Permita agregar y eliminar elementos a traves del iteradorretornando un iterador nuevo cuando corresponda.Puede hacer uso de las listas enlazadas y los algoritmos sobreiteradores de la librera standard:

    # i n c lu d e < l is t >

    # i n c l u d e < a l g o ri t h m >

    En la pagina http://www.cplusplus.com/reference/ puedenencontrar la documentacion de estos modulos.

    Algoritmos y estructuras de datos II Clase de Iteradores en C++

    http://find/