¿Qué están haciendo iOS: sync_with_stdio (0) y cin.tie (0)? He leído en alguna parte que hacen que la entrada y la salida sean más eficientes.

A menudo se recomienda usar scanf / printf en lugar de cin / cout para una entrada y salida rápidas. Sin embargo, aún puede usar cin / cout y lograr la misma velocidad que scanf / printf al incluir las siguientes dos líneas en su función main ():

ios_base :: sync_with_stdio (falso);

Activa o desactiva la sincronización de todas las secuencias estándar de C ++ con sus correspondientes secuencias estándar de C si se llama antes de que el programa realice su primera operación de entrada o salida. Agregar ios_base :: sync_with_stdio (falso); (lo cual es cierto por defecto) antes de que cualquier operación de E / S evite esta sincronización. Es un miembro estático de la función de std :: ios_base.

cin.tie (NULL);

tie () es un método que simplemente garantiza el vaciado de std :: cout antes de que std :: cin acepte una entrada. Esto es útil para los programas de consola interactivos que requieren que la consola se actualice constantemente pero también ralentiza el programa para E / S grandes. La parte NULL solo devuelve un puntero NULL .

Además, puede incluir la biblioteca de plantillas estándar (STL) con una sola inclusión:

#include

Entonces su plantilla para programación competitiva podría verse así:

#include
usando el espacio de nombres estándar;

int main ()
{
ios_base :: sync_with_stdio (falso);
cin.tie (NULL);
devuelve 0;
}

Se recomienda utilizar cout << "\ n"; en lugar de cout << endl ;. endl es más lento porque fuerza un flujo de descarga , que generalmente es innecesario (consulte esto para más detalles). (Necesitaría enjuagar si estaba escribiendo, por ejemplo, una barra de progreso interactiva, pero no cuando escribe un millón de líneas de datos). Escriba ‘\ n en lugar de endl.

Hay una forma más para una entrada o salida mucho más rápida . A menudo es utilizado por programadores competitivos para acelerar el procesamiento en los problemas que involucran grandes casos de prueba.

getchar_unlocked () es similar a getchar () con la excepción de que no es seguro para subprocesos. A continuación se muestra un código de ejemplo.

#include
int main ()
{
// La sintaxis es la misma que getchar ()
char c = getchar_unlocked ();
printf (“El carácter introducido es% c”, c);
devuelve 0;
}

Los siguientes son algunos puntos importantes:

  1. Como no es seguro para subprocesos, se evitan todos los gastos generales de exclusión mutua y es más rápido que getchar ().
  2. Puede ser especialmente útil para problemas de programación competitivos con ” Advertencia: grandes datos de E / S, tenga cuidado con ciertos idiomas (aunque la mayoría debería estar bien si el algoritmo está bien diseñado) “.
  3. No hay ningún problema con el uso de getchar_unlocked () incluso en un entorno multiproceso, siempre que el hilo que lo usa sea el único objeto que accede al archivo
  4. Una diferencia más con getchar () es que no es una función de biblioteca estándar de C, sino una función POSIX. Es posible que no funcione en compiladores basados ​​en Windows.
  5. Es un hecho conocido que scanf () es más rápido que cin y getchar () es más rápido que scanf () en general. getchar_unlocked () es más rápido que getchar (), por lo tanto, el más rápido de todos.
  6. Del mismo modo, hay getc_unlocked () putc_unlocked () y putchar_unlocked () que son versiones no seguras para subprocesos de getc (), putc () y putchar () respectivamente.