Algoritmos y lambdas
Dejar de escribir loops a mano: sort, find, count, lambdas con capturas, comparadores, erase-remove, std::function, búsqueda binaria y ranges.
13 aulas · 11 horas de práctica · en el navegador, sin instalar nada
Temario
- <algorithm>: sort, find y count — Los loops que escribiste a mano ya están escritos, probados y optimizados: ordenar, buscar y contar con una línea, y el par de iteradores begin/end que usan todos.
- Lambdas — Una función sin nombre que se escribe justo donde se usa: guardarla en una variable, llamarla, darle parámetros y pasársela a un algoritmo para decirle cómo ordenar.
- Capturas por valor y por referencia — Una lambda no ve las variables de la función donde está escrita: las tiene que capturar. Por valor se lleva una copia del momento; por referencia, la variable misma. Y una lambda con estado propio.
- Comparadores y stable_sort — Ordenar structs: el comparador elige la columna y el sentido, los desempates se escriben en cadena, y stable_sort respeta el orden de los empatados. Y por qué >= rompe sort.
- find_if, count_if y any_of — Buscar, contar y preguntar con una condición en vez de un valor: find_if, count_if, any_of / all_of / none_of y copy_if, con lambdas que capturan lo que saben los investigadores.
- transform y accumulate — Convertir cada elemento en otra cosa (transform) y juntar todos en un resultado (accumulate): de códigos a platos, de "MILANESA" a "milanesa", y la cuenta con centavos sin perderlos.
- remove_if y el idiom erase-remove — remove no borra: corre los que se quedan hacia adelante y devuelve dónde termina lo que vale. erase hace el resto. El idiom erase-remove, erase_if de C++20, unique, y por qué borrar adentro de un for a mano saltea elementos.
- std::function y callbacks — Un tipo para "cualquier cosa que se pueda llamar así": guardar lambdas en variables, en un map o en un vector, llamarlas cuando pase algo (callbacks), el function vacío, y lambdas que fabrican lambdas.
- lower_bound y binary_search — Buscar en un vector ordenado partiendo por la mitad: binary_search para saber si está, lower_bound y upper_bound para saber dónde, insertar sin desordenar, y por qué todo se rompe si el vector no está ordenado.
- Ranges y views (C++20) — Los algoritmos de C++20 que reciben el contenedor entero, y las views: filtrar, transformar, cortar y dar vuelta una lista con |, sin copiarla. El orden de los pasos importa, y ranges::sort con proyección.
- partition y algoritmos de conjuntos — Separar una lista en dos con partition (y stable_partition, que respeta el orden), y operar con listas ordenadas como conjuntos: intersección, diferencia e inclusión.
- Taller: la tabla del torneo — De quince resultados a la tabla de posiciones, sin un solo loop de conteo a mano: accumulate para los puntos y la diferencia, sort con desempates, none_of para los invictos y max_element para el líder.
- Taller: el motor de reglas — Un juego de cartas donde las reglas son datos: cada una es una lambda guardada en un std::function, y el puntaje es un accumulate sobre la lista de reglas. Sumar una regla es sumar un elemento, no tocar el motor.