Introduzione alla libreria Ranges di C++20
Usi gli algoritmi std::ranges che accettano intervalli invece di coppie di iteratori
Introduzione alla libreria Ranges di C++20 è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 3 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.
Perché usare i range?
La STL tradizionale accetta coppie di iteratori (v.begin(), v.end()). I range di C++20 accettano un singolo valore range e aggiungono la componibilità.
Inclusione dei range
Includa <ranges>. Gli spazi dei nomi sono std::ranges per gli algoritmi e std::views per le view lazy.
#include <ranges>
#include <algorithm>Algoritmi sui range
Ogni algoritmo standard ha una controparte per i range che accetta un range invece di due iteratori.
std::vector<int> v = {3, 1, 4, 1, 5};
std::ranges::sort(v); // sort the whole range
auto it = std::ranges::find(v, 4);Funzioni di proiezione
Gli algoritmi sui range accettano una proiezione facoltativa: una funzione applicata a ogni elemento prima del confronto. Evita di scrivere comparatori personalizzati.
struct Person { std::string name; int age; };
std::vector<Person> people;
std::ranges::sort(people, {}, &Person::age);
// sort by age, default comparisonChe cos'è un range?
Un range è qualsiasi oggetto che supporti begin() e end(). Include contenitori, array e, in C++20, qualsiasi tipo personalizzato che esponga un sentinel.
Sentinel
C++20 generalizza end() in un sentinel: non deve necessariamente essere dello stesso tipo dell'iteratore. È utile per gli stream di input e i range infiniti.
View: pipeline di range lazy
Una view è un range non proprietario che produce gli elementi su richiesta. Le componga con l'operatore pipe |.
auto squares = v
| std::views::filter([](int x) { return x % 2 == 0; })
| std::views::transform([](int x) { return x * x; });
for (int x : squares) std::cout << x << " ";Valutazione lazy
Le view non allocano memoria e non vengono eseguite finché non si esegue l'iterazione. filter | transform | take(5) produce solo i primi 5 valori trasformati, niente di più.
Range in prestito e durata di vita
Le view prendono in prestito il range sorgente. Se la sorgente viene distrutta, la view diventa pendente. Presti attenzione alle view su temporanei, anche se C++20 ha aggiunto alcune protezioni.
Eager e lazy
Gli algoritmi producono i risultati eager (li calcolano subito). Le view sono lazy (calcolano durante l'iterazione). Scelga in base alla necessità o meno di materializzare il risultato.
Prestazioni
Le pipeline lazy evitano i contenitori intermedi. Spesso il compilatore ottimizza le pipeline come se fossero un unico ciclo. Verifichi con godbolt.
Percorso di migrazione
Se non può usare C++20, librerie come range-v3 di Eric Niebler forniscono lo stesso modello in C++14/17. Vale la pena impararlo oggi per semplificare la migrazione.
Verifica rapida
Qual è il principale vantaggio dei range di C++20 rispetto allo stile STL basato su coppie di iteratori?
Riepilogo
I range di C++20 modernizzano gli algoritmi della STL: si passa un singolo range, si usano le proiezioni e si costruiscono pipeline lazy con le view. L'operatore pipe combina filtri, trasformazioni e operazioni take in un codice chiaro e dichiarativo.
Domande Frequenti
La lezione «Introduzione alla libreria Ranges di C++20» è gratuita?
Sì — il testo completo di «Introduzione alla libreria Ranges di C++20» è 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 «Introduzione alla libreria Ranges di C++20»?
Usi gli algoritmi std::ranges che accettano intervalli invece di coppie di iteratori 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 3 di 4.
Quanto tempo richiede la lezione «Introduzione alla libreria Ranges di C++20»?
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
- Categorie di iteratori: input, forward, bidirectional, random
- Pattern comuni per gli iteratori: begin, end, advance
- Introduzione alla libreria Ranges di C++20
- Adattatori di intervalli: views::filter, transform, take