HOWTO · C++

Come scorrere un array in C++

In questo articolo viene illustrato come eseguire l'iterazione su un array in C++

In questa pagina

Un array contiene un numero fisso di elementi dello stesso tipo. Per visitarli tutti, scegli il ciclo in base a ciò che ti serve: l’indice, la possibilità di modificare gli elementi oppure un algoritmo che accetta una funzione richiamabile. Ciascun esempio qui sotto definisce il proprio array e la propria funzione main, quindi può essere compilato come programma indipendente. (C++)

Uso di un ciclo for con indice

Un ciclo con indice rende disponibile la posizione corrente tramite i. Le sue tre espressioni inizializzano l’indice, controllano che sia ancora entro i limiti dell’array e lo incrementano dopo ogni iterazione. Il confronto usa < count perché in un array di cinque elementi gli indici validi vanno da 0 a 4.

Esegui questo esempio:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

#include <iostream>

int main() {
    int values[] = {10, 20, 30, 40, 50};
    const int count = sizeof(values) / sizeof(values[0]);

    for (int i = 0; i < count; ++i) {
        std::cout << values[i] << ' ';
    }
    std::cout << '\n';
}
10 20 30 40 50

L’espressione sizeof calcola il numero di elementi mentre values è ancora un array. Quando passi l’array a una funzione, al suo interno viene trattato come un puntatore: passa quindi il numero di elementi separatamente oppure usa un contenitore che ne conservi la dimensione. Mantieni la condizione legata al numero di elementi e incrementa i una volta per iterazione, così eviti di accedere oltre l’ultimo elemento.

Uso di un ciclo while

Un ciclo while è utile quando la condizione per continuare è più articolata di un semplice conteggio. Per scorrere un array, inizializza l’indice prima del ciclo, controllalo prima di accedere all’elemento e incrementalo nel corpo del ciclo. Se dimentichi di aggiornarlo, il ciclo potrebbe non terminare.

Esegui questo esempio:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

#include <iostream>

int main() {
    int values[] = {5, 15, 25, 35};
    const int count = sizeof(values) / sizeof(values[0]);
    int i = 0;

    while (i < count) {
        std::cout << values[i] << ' ';
        ++i;
    }
    std::cout << '\n';
}
5 15 25 35

Questo ciclo visita gli elementi nell’ordine degli indici. Usa un ciclo for quando inizializzazione, condizione e aggiornamento sono strettamente collegati; scegli while quando la condizione o l’aggiornamento dipendono da altre operazioni eseguite nel ciclo.

Uso di un ciclo for basato su intervallo

Un ciclo basato su intervallo visita direttamente ogni elemento, senza specificare un indice. Una variabile semplice come int value è una copia, adatta ai valori piccoli quando il ciclo deve solo leggerli. Usa const int& per evitare la copia mantenendo gli elementi in sola lettura, oppure int& se il ciclo deve modificare l’array originale.

Esegui questo esempio:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

#include <iostream>

int main() {
    int values[] = {1, 2, 3, 4, 5};

    for (const int& value : values) {
        std::cout << value << ' ';
    }
    std::cout << '\n';
}
1 2 3 4 5

Per esempio, se cambi la variabile del ciclo in int& value e assegni un valore a value, aggiorni l’elemento corrispondente dell’array. Questa forma è concisa quando elabori ogni elemento in ordine e non ti serve conoscerne la posizione.

Uso di std::for_each per scorrere un array

std::for_each è un algoritmo, non un metodo. Riceve gli iteratori che indicano l’inizio e la posizione subito dopo la fine di un intervallo, seguiti da una funzione richiamabile che viene invocata per ogni elemento. Includi <algorithm> per l’algoritmo e <array> per std::array.

Esegui questo esempio:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

#include <algorithm>
#include <array>
#include <iostream>

int main() {
    std::array<int, 4> values = {2, 4, 6, 8};

    std::for_each(values.begin(), values.end(), [](int value) {
        std::cout << value * 2 << ' ';
    });
    std::cout << '\n';
}
4 8 12 16

In questo esempio, la lambda è la funzione richiamabile. Il suo parametro int value copia ciascun elemento; usa int& value se la funzione deve modificare l’array. begin() indica il primo elemento e end() la posizione subito dopo l’ultimo: insieme delimitano l’intero intervallo che l’algoritmo deve visitare.

Scelta del ciclo adatto alla tua attività

Usa un ciclo for con indice quando ti serve la posizione, devi confrontare un elemento con uno adiacente oppure vuoi controllare l’incremento tra le posizioni. Scegli while quando è una condizione separata a determinare quando interrompere lo scorrimento. Un ciclo for basato su intervallo offre un accesso diretto e leggibile a ogni elemento; usa un riferimento se vuoi evitare copie o modificare i valori. Scegli std::for_each quando esprimere il lavoro come funzione richiamabile si adatta a un approccio basato sugli algoritmi. Tutte queste forme permettono di scorrere un array: scegli in base alle informazioni e al controllo richiesti dall’attività e mantieni gli accessi tramite indice entro i limiti validi dell’array.