¡Esta es una revisión vieja del documento!
Notar que en todos los casos, cuando queremos hablar de un rango de números, indicamos sus extremos como [A, B)
, es decir, utilizamos como extremos dos números A
y B
de modo que los números del rango son aquellos $x$ que cumplen $A \leq x < B$. Esta elección de “fronteras”, que es cerrada a izquierda, pero abierta a la derecha, es para casi toda tarea de programación la más conveniente, y se utiliza mucho en los lenguajes de programación como C++. También es la que más recomendamos, porque evita muchos errores y es más clara que otras, una vez que uno la conoce.
Iterar los números desde 0
hasta n-1
inclusive, con la variable i
que es creada para el for:
#define forn(i,n) for(int i=0;i<int(n);i++)
Iterar los números desde s
hasta n-1
inclusive, con la variable i
que es creada para el for:
#define forsn(i,s,n) for(int i=int(s);i<int(n);i++)
Iterar los números desde n-1
hasta 0
inclusive, bajando con la variable i
que es creada para el for:
#define dforn(i,n) for(int i=int(n)-1;i>=0;i--)
Iterar los números desde n-1
hasta s
inclusive, bajando con la variable i
que es creada para el for:
#define dforsn(i,s,n) for(int i=int(n)-1;i>=int(s);i--)
Las siguientes macros son cómodas para iterar una colección hacia adelante o hacia atrás, si nos interesa tener acceso al iterador y no solamente a los elementos iterados. Eran necesarias (utilizando typeof
en lugar de auto
) antes de c++11 para iterar sets y maps, pues no existía el foreach
.
#define forall(i,c) for(auto i = (c).begin(); i != (c).end(); i++) #define dforall(i,c) for(auto i = (c).rbegin(); i != (c).rend(); i++)
La siguiente es muy útil para utilizar con funciones de STL, donde se suele pedir un rango mediante dos iteradores, para pasar directamente una colección completa.
#define all(c) (c).begin(),(c).end()
El uso más común de todos es al llamar a la función sort
, con sort(all(v))
por ejemplo, siendo v
un vector.
La siguiente sirve para consultar si un elemento está en un set (o map. En un map, se consulta si el elemento dado es una clave del diccionario).
#define esta(x,c) ((c).find(x) != (c).end())
Las siguientes son muy útiles para buscar y corregir errores en programas:
#define DBG(x) cerr << #x << " = " << (x) << endl #define RAYA cerr << "===============================" << endl
DBG es una macro particularmente bonita y “mágica”. Si escribimos en una línea DBG(x);
en el código, siendo x
una variable (o podría ser una expresión), nos mostrará su valor y su nombre por pantalla. Alentamos a probarla para ver su utilidad a la hora de buscar bugs en programas.
Similarmente, RAYA;
muestra una clara línea separadora: esto es especialmente útil cuando tenemos un for
y queremos mostrar los valores en cada iteración. Poniendo un RAYA;
, podemos separar con facilidad los valores entre iteraciones.
Los siguientes typedef
son razonables y cómodos en programación competitiva:
typedef long long tint; typedef long double tdbl; typedef vector<int> vint; typedef pair<int,int> pint; typedef pair<tint,tint> ptint;