Come funziona il range-based for per gli array semplici?
È da leggere come, " Dimmi cosa fa un ranged-for (con gli array)? "
Risponderò supponendo che: prendi il seguente esempio utilizzando array annidati:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (auto &pl : ia)
Versione testo:
ia
è un array di array ("array annidato"), contenente [3]
array, ciascuno contenente [4]
valori. L'esempio precedente scorre in ia
base al suo "intervallo" principale ( [3]
) e quindi esegue un ciclo di [3]
volte. Ogni loop produce uno dei ia
's [3]
valori primari partire dal primo e termina con l'ultimo - matrice An contenenti [4]
valori.
- Primo ciclo:
pl
uguale a {1,2,3,4}
- Un array
- Secondo ciclo:
pl
uguale a {5,6,7,8}
- Un array
- Terzo ciclo:
pl
uguale a {9,10,11,12}
- Un array
Prima di spiegare il processo, ecco alcuni promemoria amichevoli sugli array:
- Gli array vengono interpretati come puntatori al loro primo valore: l'utilizzo di un array senza alcuna iterazione restituisce l'indirizzo del primo valore
pl
dovere essere un riferimento perché non possiamo copiare gli array
- Con gli array, quando aggiungi un numero all'oggetto array stesso, avanza molte volte e 'punta' alla voce equivalente - Se
n
è il numero in questione, allora ia[n]
è lo stesso di *(ia+n)
(Stiamo dereferenziando l'indirizzo che è n
voci avanti) ed ia+n
è uguale a &ia[n]
(Stiamo ottenendo l'indirizzo di quella voce nell'array).
Ecco cosa sta succedendo:
- Su ogni ciclo,
pl
è impostato come riferimento a ia[n]
, con n
uguale al conteggio del ciclo corrente a partire da 0. Quindi, pl
è ia[0]
sul primo giro, sul secondo è ia[1]
e così via. Recupera il valore tramite iterazione.
- Il ciclo continua finché
ia+n
è minore di end(ia)
.
... E questo è tutto.
È davvero solo un modo semplificato per scrivere questo :
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];
Se il tuo array non è annidato, questo processo diventa un po 'più semplice in quanto non è necessario un riferimento , perché il valore iterato non è un array ma piuttosto un valore "normale":
int ib[3] = {1,2,3};
for (auto pl : ib)
cout << pl;
for (int n = 0; n != 3; ++n)
cout << ib[n];
Alcune informazioni aggiuntive
E se non volessimo utilizzare la auto
parola chiave durante la creazione pl
? Come sarebbe?
Nell'esempio seguente, pl
fa riferimento a un file array of four integers
. Ad ogni loop pl
viene assegnato il valore ia[n]
:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (int (&pl)[4] : ia)
E ... è così che funziona, con informazioni aggiuntive per spazzare via ogni confusione. È solo un for
ciclo "abbreviato" che conta automaticamente per te, ma non ha un modo per recuperare il ciclo corrente senza farlo manualmente.
for
. Ma nel momento in cui l'array decade in un puntatore, le informazioni sulla dimensione vengono perse.