¿Cómo funciona el basado en rango para arreglos simples?
¿Es eso para leer como, " Dime qué hace un rango (con matrices)? "
Responderé asumiendo eso: tome el siguiente ejemplo usando matrices anidadas:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (auto &pl : ia)
Versión de texto:
ia
es una matriz de matrices ("matriz anidada"), que contiene [3]
matrices, y cada una contiene [4]
valores. El ejemplo anterior recorre ia
su 'rango' primario ( [3]
) y, por lo tanto, repite [3]
tiempos. Cada ciclo produce uno de ia
los [3]
valores primarios comenzando por el primero y terminando con el último: una matriz que contiene [4]
valores.
- Primer ciclo:
pl
igual a {1,2,3,4}
- Una matriz
- Segundo ciclo:
pl
igual a {5,6,7,8}
- Una matriz
- Tercer ciclo:
pl
igual a {9,10,11,12}
- Una matriz
Antes de explicar el proceso, aquí hay algunos recordatorios amigables sobre las matrices:
- Las matrices se interpretan como punteros a su primer valor: el uso de una matriz sin ninguna iteración devuelve la dirección del primer valor
pl
debe ser una referencia porque no podemos copiar matrices
- Con las matrices, cuando agrega un número al objeto de matriz en sí, avanza tantas veces y 'apunta' a la entrada equivalente: si
n
es el número en cuestión, entonces ia[n]
es lo mismo que *(ia+n)
(estamos desreferenciando la dirección que son n
entradas forward), y ia+n
es lo mismo que &ia[n]
(Estamos obteniendo la dirección de esa entrada en la matriz).
Esto es lo que está pasando:
- En cada bucle,
pl
se establece como una referencia a ia[n]
, n
igualando el recuento del bucle actual comenzando desde 0. Entonces, pl
está ia[0]
en la primera ronda, en la segunda está ia[1]
, y así sucesivamente. Recupera el valor mediante iteración.
- El bucle continúa mientras
ia+n
sea menor que end(ia)
.
... Y eso es todo.
En realidad, es solo una forma simplificada de escribir esto :
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (int n = 0; n != 3; ++n)
auto &pl = ia[n];
Si su matriz no está anidada, entonces este proceso se vuelve un poco más simple en el sentido de que no se necesita una referencia , porque el valor iterado no es una matriz sino un valor 'normal':
int ib[3] = {1,2,3};
for (auto pl : ib)
cout << pl;
for (int n = 0; n != 3; ++n)
cout << ib[n];
Alguna información adicional
¿Qué pasa si no queremos usar la auto
palabra clave al crear pl
? Como se veria eso?
En el siguiente ejemplo, se pl
refiere a un array of four integers
. En cada bucle pl
se le da el valor ia[n]
:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (int (&pl)[4] : ia)
Y ... Así es como funciona, con información adicional para eliminar cualquier confusión. Es solo un for
bucle 'taquigráfico' que cuenta automáticamente para usted, pero carece de una forma de recuperar el bucle actual sin hacerlo manualmente.
for
. Pero en el momento en que esa matriz se convierte en un puntero, la información de tamaño se pierde.