C++ Iteradores C (Punteros)


Ejemplo

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

Este código emitiría los números del 1 al 5, uno en cada línea de la siguiente manera:

1
2
3
4
5

Rompiendolo

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

Esta línea crea una nueva matriz de enteros con 5 valores. Las matrices C son solo punteros a la memoria donde cada valor se almacena junto en un bloque contiguo.

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

Estas líneas crean dos punteros. El primer puntero recibe el valor del puntero de matriz, que es la dirección del primer elemento de la matriz. El operador sizeof cuando se utiliza en una matriz C devuelve el tamaño de la matriz en bytes. Dividido por el tamaño de un elemento, se obtiene el número de elementos en la matriz. Podemos usar esto para encontrar la dirección del bloque después de la matriz.

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

Aquí creamos un puntero que usaremos como iterador. Se inicia con la dirección del primer elemento que queremos para repetir, y vamos a seguir para recorrer todo el tiempo que i es menor que afterLast , lo que significa el tiempo que i está apuntando a una dirección dentro de array .

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

Por último, dentro del bucle podemos acceder al valor al que apunta nuestro iterador i mediante la anulación de la referencia. Aquí el operador de desreferencia * devuelve el valor en la dirección en i .