0Pricing
C++ Academy · Lezione

Pattern comuni per gli iteratori: begin, end, advance

Usi efficacemente std::begin, std::end, std::advance e gli iteratori inversi

Pattern comuni per gli iteratori: begin, end, advance è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.

begin() e end()

Ogni contenitore standard espone begin() (il primo elemento) e end() (la posizione subito dopo l'ultimo). Il range semiaperto [begin, end) è il modo canonico di iterare.

std::vector<int> v = {1, 2, 3};
for (auto it = v.begin(); it != v.end(); ++it) {
    std::cout << *it << " ";
}

std::begin e std::end

Funzioni libere in <iterator> che funzionano con qualsiasi contenitore, inclusi gli array C.

int arr[] = {1, 2, 3, 4};
for (auto it = std::begin(arr); it != std::end(arr); ++it) {
    std::cout << *it << " ";
}

cbegin e cend

Le versioni con c restituiscono un const_iterator. Le usi quando non deve modificare gli elementi e vuole che il compilatore lo garantisca.

rbegin e rend

Iteratori inversi. rbegin() punta all'ultimo elemento, mentre rend() punta alla posizione precedente al primo.

for (auto it = v.rbegin(); it != v.rend(); ++it) {
    std::cout << *it << " ";
}

std::next e std::prev

Restituiscono un iteratore spostato rispetto a un altro, senza modificare quello originale.

auto it = v.begin();
auto next3 = std::next(it, 3);     // it + 3
auto prev1 = std::prev(it);         // it - 1

std::advance

Modifica un iteratore sul posto spostandolo di una determinata distanza. Seleziona l'implementazione migliore in base alla categoria.

auto it = v.begin();
std::advance(it, 5);          // moves it forward by 5

std::distance

Misura il numero di passi tra due iteratori. È O(1) per l'accesso casuale e O(n) negli altri casi.

auto d = std::distance(v.begin(), it);   // index of it

Iteratori di inserimento

Adattatori che trasformano l'assegnazione in un'inserzione:

  • std::back_inserter — push_back
  • std::front_inserter — push_front
  • std::inserter — inserisce in una posizione
std::vector<int> dst;
std::copy(src.begin(), src.end(), std::back_inserter(dst));

Iteratori di stream

Usi gli stream come range con std::istream_iterator e std::ostream_iterator.

// Read all ints from cin, print to cout
std::copy(
    std::istream_iterator<int>(std::cin),
    std::istream_iterator<int>{},
    std::ostream_iterator<int>(std::cout, " ")
);

Cancellazione durante l'iterazione

erase restituisce il successivo iteratore valido. Lo acquisisca e lo riutilizzi.

for (auto it = v.begin(); it != v.end(); ) {
    if (*it < 0) it = v.erase(it);
    else         ++it;
}

Invalidazione degli iteratori

La modifica di un contenitore può invalidare i suoi iteratori. I vector invalidano gli iteratori durante il ridimensionamento; le list li mantengono validi, tranne quelli degli elementi cancellati.

Verifica rapida

Quale funzione restituisce un iteratore che punta alla posizione dopo l'ultimo elemento di un contenitore?

Riepilogo

Usi begin()/end() per l'iterazione in avanti e rbegin()/rend() per quella inversa. std::next, std::prev, std::advance e std::distance funzionano in modo generico. Gli iteratori di inserimento adattano l'assegnazione trasformandola in un'inserzione.

Domande Frequenti

La lezione «Pattern comuni per gli iteratori: begin, end, advance» è gratuita?

Sì — il testo completo di «Pattern comuni per gli iteratori: begin, end, advance» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.

Cosa imparerò in «Pattern comuni per gli iteratori: begin, end, advance»?

Usi efficacemente std::begin, std::end, std::advance e gli iteratori inversi Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C++ Academy?

Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Pattern comuni per gli iteratori: begin, end, advance»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C++ Academy?

Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Categorie di iteratori: input, forward, bidirectional, random
  2. Pattern comuni per gli iteratori: begin, end, advance
  3. Introduzione alla libreria Ranges di C++20
  4. Adattatori di intervalli: views::filter, transform, take
← Torna a C++ Academy