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 iabase 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:
pluguale a {1,2,3,4}- Un array
- Secondo ciclo:
pluguale a {5,6,7,8}- Un array
- Terzo ciclo:
pluguale 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 è nvoci 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 nuguale 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 autoparola chiave durante la creazione pl? Come sarebbe?
Nell'esempio seguente, plfa riferimento a un file array of four integers. Ad ogni loop plviene 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 forciclo "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.