Range-v3: Una introducción a la biblioteca (Parte VI)

Artículos de la serie:


En este post proporcionaremos dos nuevos ejemplos de programación con la biblioteca Range-v3, un subconjunto de la cual ha sido adoptada por el nuevo estándar del lenguaje C++20. Puedes consultar los espacios de nombres utilizados por este artículo en el primer post de la serie.


Ejemplo 9: cycle


Consideremos un menú de selección de armamento en un videojuego, consistente en tres casillas: arrow, sword y bomb. Supongamos que el jugador puede avanzar o retroceder de forma cíclica en dicho menú mediante su teclado o mando.

La vista cycle incluida en el fichero de cabecera <range/v3/view/cycle.hpp> permite simular fácilmente esta situación. Representemos el menú como un simple array de strings:

   auto const menu = array{"arrow"s, "sword"s, "bomb"s};    

Podemos obtener un rango formalmente infinito que repita sin cesar el rango menu de armamento sin más que aplicar a éste la vista cycle. Un iterador nos permitirá entonces recorrer libremente dicha vista:

   auto rng = menu | rv::cycle; // "arrow", "sword", "bomb", "arrow", "sword", ...    auto it = rng.begin();    advance(it, 7);  // avanzamos 7 casillas desde "arrow"    print("{}\n", *it); // output: sword    advance(it, -8);  // retrocedemos 8 casillas desde la posición actual    print("{}\n", *it); // output: bomb

Observemos que en este caso, dado que el iterador de un array es de acceso aleatorio, podemos tanto avanzar como retroceder a lo largo de la vista mediante un offset arbitrario.


Ejemplo 10: keys, values


Dado un rango de objetos std::pair, las vistas keysvalues incluidas en el fichero de cabecera <range/v3/view/map.hpp> retornan nuevos rangos con los primeros y los segundos elementos de dichas parejas, respectivamente. Esto resulta especialmente útil al trabajar con contenedores asociativos como std::map:

   auto phone_book = map<string, int>{{"John"567}, {"Sarah"889}, {"Albert"144}};        for (string const& name : phone_book | rv::keys)       print("{} ", name); // output: Albert John Sarah    for (int const number : phone_book | rv::values)       print("{} ", number); // output: 144 567 889

No hay comentarios:

Publicar un comentario