PDA

Visualizza la versione completa : C++ implementare un iteratore


drudox
06-03-2012, 17:50
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

ramy89
06-03-2012, 18:08
Su cosa vuoi iterare? Hai una classe vettore o lista? :confused:

drudox
06-03-2012, 18:31
In una lista , la avevo postata ieri per un falso allarme .. qui :

http://forum.html.it/forum/showthread.php?s=&threadid=1499499 (http://)

shodan
06-03-2012, 19:44
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/std/iterator/ForwardIterator/
in quanto (mi pare) la tua lista non è bidirezionale.

drudox
06-03-2012, 19:51
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 :




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 ..


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

drudox
06-03-2012, 19:53
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

shodan
06-03-2012, 20:45
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:


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:


ListNode<NODETYPE> *NewPtr = getNewNode(value) ;

non


List<NODETYPE> *NewPtr = getNewNode(value) ;

drudox
06-03-2012, 20:53
grazie 1000 :) faccio qualche prova ;)

drudox
06-03-2012, 20:54
si si insertAtBack mi era sfuggita .. oggi provandola ho subito notato ;)

ramy89
06-03-2012, 20:55
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 (http://pastebin.com/ifmgd9Sn).

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.

Loading