C++ de los fundamentos al dominio — Lección 18
Crear canalizaciones de datos diferidas con Ranges y Views
Los artículos de este blog se han escrito con fines didácticos. Pueden contener errores; contrasta la información con el compilador y la biblioteca estándar de tu plataforma.
Los iteradores separan contenedores y algoritmos, pero las llamadas clásicas repiten begin y end. C++20 Ranges acepta un rango completo y Views combina transformaciones diferidas sin copiar los datos de origen.
Pasar un rango directamente
std::vector<int> scores{30, 80, 50, 100};
std::ranges::sort(scores);
auto found = std::ranges::find(scores, 80);
if (found != scores.end())
{
// Valor encontrado.
}
Se reduce el riesgo de mezclar iteradores de contenedores distintos. Una projection también puede seleccionar un miembro directamente.
std::ranges::sort(players, {}, &Player::Score);
Una View calcula bajo demanda
auto visibleNames = players
| std::views::filter([](const Player& p) { return p.IsVisible; })
| std::views::transform([](const Player& p) -> const std::string&
{
return p.Name;
})
| std::views::take(10);
for (const std::string& name : visibleNames)
DrawName(name);
La canalización no crea tres vectores intermedios. Filter y transform se ejecutan cuando la iteración pide elementos, y take(10) se detiene tras un máximo de diez.
La mayoría de Views no posee los datos
auto MakeBadView()
{
std::vector<int> local{1, 2, 3};
return local | std::views::filter([](int value) { return value > 1; });
}
La View devuelta referencia un vector local destruido al salir de la función. Iterarla después accede a un objeto cuya vida terminó.
Antes de guardar o devolver una View, demuestra que el rango origen vive más que todos sus usos. Si el resultado necesita propiedad independiente, materialízalo explícitamente en un contenedor.
La evaluación diferida también retrasa errores y efectos hasta la iteración. Modificar el origen sigue sujeto a las reglas normales de invalidación de iteradores.
Ranges es valioso porque expresa etapas del flujo de datos, no solo porque acorta la sintaxis. Si la canalización es larga o mezcla mutaciones, nombra los pasos intermedios o vuelve a algoritmos explícitos.