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
}Sfida
FacileCostruiamo 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 classeInventoryche gestisce una collezione di quantità di articoli memorizzate in unstd::vector<int>.La tua classe dovrebbe fornire questi metodi:
addItem(int quantity): aggiunge una quantità di articoli all'inventarioprintForward(): usa gli iteratori conbegin()eend()per stampare tutte le quantità separate da spazi, seguite da un a capoprintReverse(): usa gli iteratori inversi conrbegin()erend()per stampare tutte le quantità in ordine inverso, separate da spazi, seguite da un a capodoubleAll(): usa gli iteratori per attraversare il vettore e raddoppiare ogni quantità direttamentegetTotal(): usa gli iteratori per calcolare e restituire la somma di tutte le quantità
Usa la parola chiave
autoper 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
Inventorye aggiungi tutte e quattro le quantità. Poi mostra l'uso degli iteratori:- Stampa
Forward:seguito dalla chiamata aprintForward() - Stampa
Reverse:seguito dalla chiamata aprintReverse() - Stampa
Total: <sum>usandogetTotal() - Chiama
doubleAll()per modificare le quantità - Stampa
After doubling:seguito dalla chiamata aprintForward() - Stampa
New total: <sum>usandogetTotal()
- Stampa
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: 160Questa 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;
}
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
1Fondamenti della programmazione orientata agli oggetti
File esterniBuild e compilazione in C++File header e file sorgenteNamespace e ambitoIntroduzione alla programmazione orientata agli oggetti in C++Classi e oggetti a confrontoIl puntatore 'this'Metodi (funzioni membro)Attributi (membri dati)Fondamenti di costruttori e distruttoriRiepilogo - Calcolatrice semplice4Proprietà delle classi
Membri di istanza e staticiGetter e setterFunzioni membro constParola chiave mutableMetodi e variabili staticiFunzioni e classi friendRiepilogo - Gestore di conti bancari7Ereditarietà
Ereditarietà di baseLivelli di accesso nell’ereditarietàOrdine di chiamata di costruttori e distruttoriRidefinizione dei metodiFunzioni virtuali e VTableEreditarietà multiplaEreditarietà virtualeRiepilogo - Gerarchia dei dipendenti10Panoramica della STL
Panoramica e filosofia della STLContenitori STLIteratoriAlgoritmi STLFuntori ed espressioni lambdaRiepilogo - Frequenza delle parole2Gestione della memoria
Memoria Stack vs HeapPuntatori e riferimentiMemoria dinamica (new/delete)Puntatori intelligenti in C++RAII in C++Riepilogo - Gestore di array dinamico5Incapsulamento
Specificatori di accesso in C++Specificatori di accesso in dettaglioOccultamento delle informazioniStruct vs classClassi annidate e interneRiepilogo - Sistema di registrazione degli studenti8Polimorfismo
Polimorfismo a compile time e a runtimeOverload delle funzioniFunzioni virtuali: ripassoFunzioni virtuali pureClassi astratteProgettazione delle interfacce in C++Dynamic casting e RTTIRipasso: calcolatrice di forme11Concetti avanzati di OOP
Composizione vs ereditarietàMixin tramite CRTPIdiom PimplType ErasureEnum class e tipizzazione forteGestione delle eccezioni in OOPGerarchie personalizzate di eccezioni14Pattern di progettazione - Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositeRAII come pattern3Costruttori e distruttori
Costruttore predefinitoCostruttore con parametriCostruttore di copiaCostruttore di spostamentoListe di inizializzazione dei costruttoriCostruttori delegantiApprofondimento sui distruttoriRegola del Tre / Cinque / ZeroRipasso - classe String6Sovraccarico degli operatori
Introduzione al sovraccarico degli operatoriSovraccarico degli operatori aritmeticiSovraccarico degli operatori di confrontoOperatori di flussoSovraccarico dell'operatore di assegnazioneSovraccarico degli operatori [] e ()Operatori di conversione di tipoRipasso - Classe Matrix9Template
Template di funzioneTemplate di classeSpecializzazione dei templateTemplate variadiciBasi di SFINAE e dei trait di tipoRiepilogo - Contenitore genericoEsercitati da solo: Compilatore C++ online