C++ C Iterators (Puntatori)


Esempio

// This creates an array with 5 values.
const int array[] = { 1, 2, 3, 4, 5 };

#ifdef BEFORE_CPP11

// You can use `sizeof` to determine how many elements are in an array.
const int* first = array;
const int* afterLast = first + sizeof(array) / sizeof(array[0]);

// Then you can iterate over the array by incrementing a pointer until
// it reaches past the end of our array.
for (const int* i = first; i < afterLast; ++i) {
    std::cout << *i << std::endl;
}

#else

// With C++11, you can let the STL compute the start and end iterators:
for (auto i = std::begin(array); i != std::end(array); ++i) {
    std::cout << *i << std::endl;
}

#endif

Questo codice produrrebbe i numeri da 1 a 5, uno su ogni riga come questa:

1
2
3
4
5

Breaking It Down

const int array[] = { 1, 2, 3, 4, 5 };

Questa linea crea un nuovo array intero con 5 valori. Gli array C sono solo indicatori della memoria in cui ogni valore è memorizzato insieme in un blocco contiguo.

const int* first = array;
const int* afterLast = first + sizeof(array) / sizeof(array[0]);

Queste linee creano due puntatori. Il primo puntatore riceve il valore del puntatore dell'array, che è l'indirizzo del primo elemento dell'array. L'operatore sizeof quando usato su un array C restituisce la dimensione dell'array in byte. Diviso per la dimensione di un elemento, questo dà il numero di elementi nella matrice. Possiamo usarlo per trovare l'indirizzo del blocco dopo l'array.

for (const int* i = first; i < afterLast; ++i) {

Qui creiamo un puntatore che utilizzeremo come un iteratore. E 'inizializzato con l'indirizzo del primo elemento che vogliamo iterare, e noi continueremo a iterare finché i è minore afterLast , il che significa che il tempo che i sta puntando a un indirizzo all'interno array .

    std::cout << *i << std::endl;

Infine, all'interno del loop possiamo accedere al valore che il nostro iteratore i sta indicando attraverso il dereferenziamento. Qui l'operatore dereferenzia * restituisce il valore all'indirizzo in i .