Artículos de la serie:
- Vistas y acciones, ejemplos 1 (generate_n, group_by, sort) y 2 (filter, to)
- Ejemplos 3 (enumerate, shuffle, take, zip) y 4 (intersperse, tokenize)
- Ejemplos 5 (getlines, transform) y 6 (iota, set_difference, split_when)
- Ejemplo 7 (stable_partition, subrange)
- Ejemplo 8 (concat, drop, generate, take_while)
- Ejemplos 9 (cycle) y 10 (keys, values)
- Ejemplo 11 (cartesian_product)
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. Pueden consultarse los espacios de nombres utilizados por este artículo en el primer post de la serie.
Ejemplo 9: cycle
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 keys y values 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