Menu
Coddy logo textTech

Iteratori

Fa parte della sezione Programmazione orientata agli oggetti del percorso C++ di Coddy. Lezione 72 di 104.

Gli iteratori sono oggetti che fungono da ponte tra contenitori e algoritmi. Forniscono un modo uniforme per accedere agli elementi di qualsiasi contenitore, indipendentemente da come quel contenitore memorizza i dati al suo interno. Pensa a un iteratore come a un puntatore generalizzato che sa come spostarsi all'interno di un contenitore.

Ogni contenitore STL fornisce i metodi begin() e end(). L'iteratore begin() punta al primo elemento, mentre end() punta alla posizione successiva all'ultimo elemento: un valore sentinella che indica dove fermarsi:

#include <vector>
#include <iostream>

int main() {
    std::vector<int> nums = {10, 20, 30};
    
    for (std::vector<int>::iterator it = nums.begin(); it != nums.end(); ++it) {
        std::cout << *it << " ";  // Dereferenzia per ottenere il valore
    }
    // Output: 10 20 30
}

La parola chiave auto semplifica notevolmente le dichiarazioni degli iteratori:

for (auto it = nums.begin(); it != nums.end(); ++it) {
    *it *= 2;  // Modifica gli elementi tramite l'iteratore
}
// nums ora è {20, 40, 60}

Gli iteratori si suddividono in diverse categorie in base alle loro capacità. Gli iteratori ad accesso casuale (come quelli di vector) supportano operazioni aritmetiche come it + 3 o it1 - it2.

Gli iteratori bidirezionali (di list, map) possono spostarsi avanti e indietro con ++ e --. Gli iteratori in avanti possono spostarsi in una sola direzione.

Per la traversata inversa, usa rbegin() e rend():

for (auto rit = nums.rbegin(); rit != nums.rend(); ++rit) {
    std::cout << *rit << " ";  // Stampa in ordine inverso
}
challenge icon

Sfida

Facile

Costruiamo un sistema di tracciamento dell'inventario che utilizza gli iteratori per attraversare e manipolare collezioni di articoli. Ti eserciterai a usare diversi tipi di iteratori per navigare tra i dati in vari modi.

Organizzerai il codice in due file:

  • Inventory.h: definisci una classe Inventory che gestisce una collezione di quantità di articoli memorizzate in un std::vector<int>.

    La tua classe dovrebbe fornire questi metodi:

    • addItem(int quantity): aggiunge una quantità di articoli all'inventario
    • printForward(): usa gli iteratori con begin() e end() per stampare tutte le quantità separate da spazi, seguite da un a capo
    • printReverse(): usa gli iteratori inversi con rbegin() e rend() per stampare tutte le quantità in ordine inverso, separate da spazi, seguite da un a capo
    • doubleAll(): usa gli iteratori per attraversare il vettore e raddoppiare ogni quantità direttamente
    • getTotal(): usa gli iteratori per calcolare e restituire la somma di tutte le quantità

    Usa la parola chiave auto per le dichiarazioni degli iteratori, così il codice rimane pulito.

  • main.cpp: leggi quattro valori interi in input (ciascuno su una riga separata) che rappresentano le quantità degli articoli.

    Crea un oggetto Inventory e aggiungi tutte e quattro le quantità. Poi mostra l'uso degli iteratori:

    1. Stampa Forward: seguito dalla chiamata a printForward()
    2. Stampa Reverse: seguito dalla chiamata a printReverse()
    3. Stampa Total: <sum> usando getTotal()
    4. Chiama doubleAll() per modificare le quantità
    5. Stampa After doubling: seguito dalla chiamata a printForward()
    6. Stampa New total: <sum> usando getTotal()

Per esempio, con gli input 10, 25, 15 e 30:

Forward: 10 25 15 30 
Reverse: 30 15 25 10 
Total: 80
After doubling: 20 50 30 60 
New total: 160

Questa sfida ti permette di esercitarti sia nella lettura degli elementi tramite iteratori (per stamparli e sommarli) sia nella loro modifica tramite iteratori (per raddoppiarli). Vedrai anche come gli iteratori inversi rendano semplice l'attraversamento all'indietro senza dover manipolare indici.

Provalo tu

#include <iostream>
#include "Inventory.h"

using namespace std;

int main() {
    // Leggi quattro valori interi in input
    int q1, q2, q3, q4;
    cin >> q1;
    cin >> q2;
    cin >> q3;
    cin >> q4;

    // TODO: Crea un oggetto Inventory

    // TODO: Aggiungi tutte e quattro le quantità all'inventario

    // TODO: Stampa "Forward: ", poi chiama printForward()

    // TODO: Stampa "Reverse: ", poi chiama printReverse()

    // TODO: Stampa "Total: " seguito dal risultato di getTotal()

    // TODO: Chiama doubleAll() per modificare le quantità

    // TODO: Stampa "After doubling: ", poi chiama printForward()

    // TODO: Stampa "New total: " seguito dal risultato di getTotal()

    return 0;
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore C++ online