Pasar spans a funciones
Escriba API flexibles
Pasar spans a funciones es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.
Una función, muchos contenedores
Una función que recibe std::span acepta por igual arrays, vectores y búferes sin formato, sin necesidad de plantillas ni sobrecargas.
#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";
}No se necesita un parámetro de tamaño
Las API antiguas de estilo C pasan un puntero y un tamaño independiente. Un span agrupa ambos, eliminando los errores causados por longitudes que no coinciden.
#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 para solo lectura
Use std::span<const T> para indicar que la función no modificará los datos del código que la llama.
#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 mutable para editar en el sitio
Un span que no es const permite que una función modifique directamente los elementos del código que la llama.
#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 proliferación de plantillas
Sin span, podría parametrizar la plantilla según el tipo de contenedor, generando muchas instanciaciones. Un span proporciona una única firma concreta que funciona directamente.
Evita copias
Pasar un span nunca copia los elementos; solo se pasan a la función un puntero y una longitud.
#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
}Los spans vacíos son válidos
Una función debe gestionar correctamente un span vacío; size() es cero y el bucle basado en rangos simplemente se ejecuta cero veces.
#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
}Pasar por valor
Los spans son pequeños, así que páselos por valor, no por referencia. Copiar un puntero y una longitud es prácticamente gratis.
Documente la intención de const
Elegir span<const T> o span<T> indica a los llamadores de un vistazo si sus datos pueden modificarse.
El código que llama conserva la propiedad
El código que llama sigue siendo propietario del contenedor; el span solo lo toma prestado durante la llamada. La función no debe almacenar el span después de que termine la llamada.
Un estilo de API moderno
Aceptar un span es la forma moderna e idiomática de escribir funciones que operan sobre datos contiguos: flexible, segura y sin copias.
Comprobación rápida
Compruebe su comprensión de cómo pasar spans.
Resumen
Ha aprendido a pasar spans a funciones:
- Una única firma acepta arrays, vectores y búferes.
- Use
span<const T>para solo lectura yspan<T>para editar en el sitio. - Páselos por valor; no se copia ningún elemento.
- El código que llama conserva la propiedad; no almacene el span después de la llamada.
Preguntas frecuentes
¿La lección «Pasar spans a funciones» es gratis?
Sí — el texto completo de «Pasar spans a funciones» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Pasar spans a funciones»?
Escriba API flexibles Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C++ Academy?
No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Pasar spans a funciones»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C++ Academy?
Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- std::array de tamaño fijo
- Conceptos básicos de std::span
- Pasar spans a funciones
- Límites y subspans