Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 41
  1. #1
    Utente di HTML.it L'avatar di drudox
    Registrato dal
    Sep 2011
    Messaggi
    93

    C++ implementare un iteratore

    Salve a tutti, sto creando una mia classe template list ..

    vorrei sapere come posso implementare un iteratore ... non ho la minima idea di come poter realizzarlo .. ho letto che bisogna utilizzare le classi nidificate .. ma da questo unica discussione non ho davvero capito la logica

    http://forum.html.it/forum/showthread/t-1447036.html

    qualcuno potrebbe darmi qualche dritta .. con qualche esempio se possibile

    Grazie infinite
    C
    C Saluti .. Il DrudoX
    C
    STOP
    END

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Su cosa vuoi iterare? Hai una classe vettore o lista?

  3. #3
    Utente di HTML.it L'avatar di drudox
    Registrato dal
    Sep 2011
    Messaggi
    93
    In una lista , la avevo postata ieri per un falso allarme .. qui :

    http://forum.html.it/forum/showthread.php?s=&threadid=1499499
    C
    C Saluti .. Il DrudoX
    C
    STOP
    END

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Per essere precisi: in particolare cosa non ti è chiaro dell'esempio di quel thread? Il fatto che usi una classe nested o altro? (Spiegare i dubbi dovrebbe essere il primo passo da fare.)

    Comunque quel che ti serve è un forward iterator
    http://www.cplusplus.com/reference/s...rwardIterator/
    in quanto (mi pare) la tua lista non è bidirezionale.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Utente di HTML.it L'avatar di drudox
    Registrato dal
    Sep 2011
    Messaggi
    93
    non mi e` chiaro quale sia il dato private di quell' iteratore .. io ho buttato giu` qualcosa di molto grezzo .. fin ora ho creato una classe nidificata all interno della lista .. in questo modo :


    codice:
    	
    	class List_iterator
    		{
    		public :
    		List_iterator()
    		{
    			p = firstPtr ;
    		}			// default constructor
    		//begin();
    		//end();	
    			private :	
    			ListNode<NODETYPE> * p;	
    
    		};

    ma non credo mi da` gia un errore compilando il main.C di prova ..

    codice:
    In file included from main.C:7:
    list.h: In constructor ‘List<NODETYPE>::List_iterator::List_iterator() [with NODETYPE = int]’:
    main.C:20:   instantiated from here
    list.h:56: error: invalid use of nonstatic data member ‘List<int>::firstPtr’
    non riesco proprio a capire come creare un foward iterator .. non ho trovato neppure molto on-line
    C
    C Saluti .. Il DrudoX
    C
    STOP
    END

  6. #6
    Utente di HTML.it L'avatar di drudox
    Registrato dal
    Sep 2011
    Messaggi
    93
    ma il link che i hai dato e` per usare gli iteratori della STL giusto ?? io vorrei imparare a farne uno da me .. credo sia un buon modo per capir bene gli iteratori della STL
    C
    C Saluti .. Il DrudoX
    C
    STOP
    END

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Gli iteratori si devono costruire in base al container che si vuole sviluppare. Il link si riferisce ai requisiti che le varie tipologie di iteratori devono soddisfare per essere conformi allo standard. Soddisfatti i requisiti, puoi usqare il tuo container come fosse standard.

    Quindi dato che la tua lista bob è bidirezionale, devi implementare il forward iterator.
    Il dato privato (che è quello che ti interessa) è: ListNode<NODETYPE>*

    Il costruttore di default setta il dato al suo valore di default (NULL ovviamente).
    L'altro costruttore i dati interni.
    Come prima aprossimazione, il tuo iteratore potrebbe assomigliare a:
    codice:
        class iterator;
        friend class iterator;
        class iterator {
            const List<NODETYPE>* parent;
    	ListNode<NODETYPE>* elem;
    	public:
    	    iterator() : parent(NULL), elem(NULL) {}
    	    iterator(
                    const List<NODETYPE>* p, 
                    ListNode<NODETYPE>* el
                ) : parent(p), elem(el) {}
    	};
    
    	iterator begin() { return iterator(this,firstptr); }
    	iterator end() { return iterator(this,NULL); } // sentinella per fine iterazione.
    Ti serve anche una funzione privata in List<> che ha il compito di trovare l'elemento successivo. (Lo scopo di parent è appunto poter usare quella funzione nell'operatore di incremento).

    P.S.

    in insertAtBack deve essere:
    codice:
       ListNode<NODETYPE> *NewPtr = getNewNode(value) ;
    non
    codice:
    List<NODETYPE> *NewPtr = getNewNode(value) ;
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  8. #8
    Utente di HTML.it L'avatar di drudox
    Registrato dal
    Sep 2011
    Messaggi
    93
    grazie 1000 faccio qualche prova
    C
    C Saluti .. Il DrudoX
    C
    STOP
    END

  9. #9
    Utente di HTML.it L'avatar di drudox
    Registrato dal
    Sep 2011
    Messaggi
    93
    si si insertAtBack mi era sfuggita .. oggi provandola ho subito notato
    C
    C Saluti .. Il DrudoX
    C
    STOP
    END

  10. #10
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Come campo interno usi un puntatore di tipo generico (con i template) e lo fai puntare a tutti gli elementi della lista.
    Devi fargli l' overloading degli operatori ++ e -- per spostarsi nelle due direzioni della lista, e dell' operatore * per accedere ai campi della lista.
    Tempo fa feci una lista generica con iteratore (ma era piena di difetti):

    Lista con iteratore.

    Ovviamente non devi guardare alla lista, quella è piena di difetti come ad esempio il fatto che l' operatore [] della lista non restituisce il riferimento ai suoi membri.
    Se la dovessi rifare ora la farei in maniera totalmente differente.
    Ma guarda all' iteratore, in pratica è una variabile in grado di spostarsi avanti e indietro nella lista, che permette anche la scrittura e la lettura dei membri.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.