Passare gli span alle funzioni
Scrivere API flessibili
Passare gli span alle funzioni è 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.
Una funzione, molti contenitori
Una funzione che accetta std::span può gestire allo stesso modo array, vector e buffer raw, senza bisogno di template o overload.
#include <iostream>
#include <span>
#include <vector>
#include <array>
int sum(std::span<const int> s) {
int t = 0; for (int x : s) t += x; return t;
}
int main() {
std::vector<int> v = {1, 2, 3};
std::array<int, 2> a = {4, 5};
std::cout << sum(v) << " " << sum(a) << "\n";
}Nessun parametro di dimensione necessario
Le vecchie API in stile C passano un puntatore e una dimensione separata. Uno span li raggruppa entrambi, eliminando i bug dovuti a lunghezze non corrispondenti.
#include <iostream>
#include <span>
void printAll(std::span<const int> s) {
for (int x : s) std::cout << x << " ";
std::cout << "\n";
}
int main() {
int buf[] = {7, 8, 9};
printAll(buf); // size inferred
}const span per la sola lettura
Utilizzi std::span<const T> per garantire che la funzione non modificherà i dati del chiamante.
#include <iostream>
#include <span>
int maxOf(std::span<const int> s) {
int m = s[0];
for (int x : s) if (x > m) m = x;
return m;
}
int main() {
int data[] = {3, 9, 4};
std::cout << maxOf(data) << "\n"; // 9
}span modificabile per l'editing in loco
Uno span non const consente a una funzione di modificare direttamente gli elementi del chiamante.
#include <iostream>
#include <span>
#include <vector>
void doubleAll(std::span<int> s) {
for (int& x : s) x *= 2;
}
int main() {
std::vector<int> v = {1, 2, 3};
doubleAll(v);
std::cout << v[2] << "\n"; // 6
}Evita la proliferazione dei template
Senza span, si potrebbe parametrizzare un template sul tipo di contenitore, generando molte istanziazioni. Uno span offre un'unica firma concreta che funziona direttamente.
Evita le copie
Passare uno span non copia mai gli elementi: nella funzione vengono trasferiti solo un puntatore e una lunghezza.
#include <iostream>
#include <span>
#include <vector>
size_t count(std::span<const int> s) { return s.size(); }
int main() {
std::vector<int> big(1000, 0);
std::cout << count(big) << "\n"; // no copy of 1000 ints
}Gli span vuoti vanno bene
Una funzione dovrebbe gestire correttamente uno span vuoto; size() restituisce zero e il ciclo for basato su intervallo viene semplicemente eseguito zero volte.
#include <iostream>
#include <span>
int sum(std::span<const int> s) { int t = 0; for (int x : s) t += x; return t; }
int main() {
std::span<const int> empty;
std::cout << sum(empty) << "\n"; // 0
}Passaggio per valore
Gli span sono piccoli, quindi li passi per valore, non per riferimento. Copiare un puntatore e una lunghezza è praticamente gratuito.
Documentare l'intento const
Scegliere span<const T> invece di span<T> comunica immediatamente ai chiamanti se i loro dati possono essere modificati.
Il chiamante mantiene la proprietà
Il chiamante mantiene la proprietà del contenitore; lo span lo prende in prestito per la durata della chiamata. La funzione non deve conservare lo span oltre la chiamata.
Uno stile moderno per le API
Accettare uno span è il modo idiomatico e moderno di scrivere funzioni che operano su dati contigui: flessibile, sicuro e senza copie.
Verifica rapida
Verifichi la comprensione del passaggio degli span.
Riepilogo
Ha imparato a passare gli span alle funzioni:
- un'unica firma accetta array, vector e buffer;
span<const T>per la sola lettura;span<T>per modificare in loco;- il passaggio per valore non copia nulla;
- il chiamante mantiene la proprietà: non conservi lo span oltre la chiamata.
Domande Frequenti
La lezione «Passare gli span alle funzioni» è gratuita?
Sì — il testo completo di «Passare gli span alle funzioni» è 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 «Passare gli span alle funzioni»?
Scrivere API flessibili 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 «Passare gli span alle funzioni»?
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
- std::array a dimensione fissa
- Nozioni di base su std::span
- Passare gli span alle funzioni
- Limiti e subspan