¿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:
iaes una matriz de matrices ("matriz anidada"), que contiene [3]matrices, y cada una contiene [4]valores. El ejemplo anterior recorre iasu 'rango' primario ( [3]) y, por lo tanto, repite [3]tiempos. Cada ciclo produce uno de ialos [3]valores primarios comenzando por el primero y terminando con el último: una matriz que contiene [4]valores.
- Primer ciclo:
pligual a {1,2,3,4}- Una matriz
- Segundo ciclo:
pligual a {5,6,7,8}- Una matriz
- Tercer ciclo:
pligual 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
nes el número en cuestión, entonces ia[n]es lo mismo que *(ia+n)(estamos desreferenciando la dirección que son nentradas forward), y ia+nes 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,
plse establece como una referencia a ia[n], nigualando el recuento del bucle actual comenzando desde 0. Entonces, plestá 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+nsea 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 autopalabra clave al crear pl? Como se veria eso?
En el siguiente ejemplo, se plrefiere a un array of four integers. En cada bucle plse 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 forbucle '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.