Range for loop su Custom Type

di il
6 risposte

Range for loop su Custom Type

Ciao a tutti,

stavo cercando di capire come implementare il "range for loop" per un mio custom type. Per essere chiaro, assumiamo che io abbia scritto la solita classe Vector, con le stesse operazioni base di std::vector, incluse ovviamente gli operator overloading di [], <<. Se volessi ora scorrere gli elementi di un
Vector<int> mio_vec{0,1,2,3,4,5,6,7,8,9};
con un range for loop, vorrei poter scrivere:


for (auto& x:mio_vec){
    std::cout << x << std::end;
}
Chiaramente, non funziona. Ho però trovato sulla documentazione che
If range_expression is an expression of a class type C that has both a member named begin and a member named end (regardless of the type or accessibility of such member), then begin_expr is __range.begin() and end_expr is __range.end();
così ho definito due member function come

    T* begin(){return &(elem[0]);}
    T* end(){return &(elem[_size]);}
dove
T
è il template.

ed ora funziona. Ho ritornato un puntatore perché ho notato che nei riquadri dove mostravano il codice veniva dereferenziato __begin. La mia domanda è: è proprio necessario ritornare l'indirizzo del primo e ultimo elemento, o magari ci sono altre possibilità? Al momento non ho trovato nulla.

6 Risposte

  • Re: Range for loop su Custom Type

    Non ho capito bene cosa stai chiedendo, ma faccio qualche precisazione.
    Le funzioni begin e end non ritornano puntatori, ma iteratori.
    la funzione end non restituisce l'ultimo elemento, ma un iteratore che punta all'elemento oltre l'ultimo (vedere la documentazione su CppReference). Per avere l'ultimo elemento devi usare rbegin, crbegin o l'operatore parentesi quadre con argomento size - 1.
  • Re: Range for loop su Custom Type

    Alexv ha scritto:


    Non ho capito bene cosa stai chiedendo
    In sostanza il problema è: data la classe Vettore, scritta da me, come posso rendere possibile un range-for loop?

    Alexv ha scritto:


    Le funzioni begin e end non ritornano puntatori, ma iteratori.
    Non ho ancora affrontato questo argomento, ma leggendo CppReference qui ho notato che un puntatore è a tutti gli effetti un iteratore. Quindi scrivendo
        T* begin(){return &(elem[0]);}
        T* end(){return &(elem[_size]);}
    questi ritornano due iteratori. Non lo sapevo, grazie. Questo spiega perché, aggiungendo quelle due member functions, ora il range-for loop viene effettuato per la mia classe.

    Alexv ha scritto:


    la funzione end non restituisce l'ultimo elemento, ma un iteratore che punta all'elemento oltre l'ultimo (vedere la documentazione su CppReference). Per avere l'ultimo elemento devi usare rbegin, crbegin o l'operatore parentesi quadre con argomento size - 1.
    Nel messaggio originale non intendevo un puntatore all'ultimo elemento, bensì a quello dopo, infatti nel riquadro avevo scritto correttamente
    &(elem[_size])


    Alla luce di questo, quello che intendevo ora è più chiaro? In particolare, è il modo più semplice per permettere un range-for loop per la mia classe vettore?
  • Re: Range for loop su Custom Type

    Iteratori e puntatori hanno la stessa interfaccia per accedere agli elementi, ma non sono la stessa cosa. Certo nel caso del vettore le due cose possono arrivare a coincidere (l'iteratore serve a scorrere qualsiasi contenitore come faresti con un vettore).
    Comunque, se ho ben capito, la tua domanda era perché ritorni per riferimento? Banalmente, visto che le tue funzioni restituiscono un puntatore, quest'ultimo viene inizializzato con un indirizzo.
  • Re: Range for loop su Custom Type

    Alexv ha scritto:


    Comunque, se ho ben capito, la tua domanda era perché ritorni per riferimento? Banalmente, visto che le tue funzioni restituiscono un puntatore, quest'ultimo viene inizializzato con un indirizzo.
    Questo mi è chiaro. Volevo sapere se c'era un altro modo per permettere un range-for loop per la mia classe.
  • Re: Range for loop su Custom Type

    feddy ha scritto:


    Questo mi è chiaro. Volevo sapere se c'era un altro modo per permettere un range-for loop per la mia classe.
    Non mi vengono in mente altri modi.
  • Re: Range for loop su Custom Type

    Ti ringrazio
Devi accedere o registrarti per scrivere nel forum
6 risposte