sirve - ¿Cómo funciona#include<bits/stdc++. H> en C++?
include stdc++ h (5)
Básicamente es un archivo de cabecera que también incluye todas las bibliotecas estándar y el archivo stl include. El único propósito que puedo ver es la prueba y la educación.
Se eg GCC 4.8.0 /bits/stdc++.h fuente .
Usarlo incluiría muchas cosas innecesarias y aumentaría el tiempo de compilación.
Editar: Como dice Neil, es una implementación para encabezados precompilados. Si lo configura correctamente para la precompilación, de hecho podría acelerar el tiempo de compilación según su proyecto. ( https://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html )
Sin embargo, le sugiero que se tome un tiempo para aprender sobre cada uno de los encabezados sl / stl e incluirlos por separado en su lugar, y no use "supercabeceras", excepto para fines de precompilación.
He leído en un blog de Codeforces que si #include <bits/stdc++.h>
en un programa C++
, entonces no hay necesidad de incluir ningún otro archivo de encabezado. ¿Cómo funciona #include <bits/stdc++.h>
y está bien usarlo en lugar de incluir archivos de encabezado individuales?
Básicamente es un archivo de encabezado que incluye todas las bibliotecas estándar.
En los concursos de programación , usar este archivo es una buena idea cuando se quiere reducir el tiempo perdido en hacer las tareas domésticas; especialmente cuando tu rango es sensible al tiempo.
En los concursos de programación , las personas se centran más en encontrar algoritmos para resolver un problema que en la ingeniería de software.
Pero en la perspectiva de la ingeniería de software , no es una buena idea usarla. Si lo usa en realidad incluye una gran cantidad de archivos, que su programa puede no necesitar, por lo tanto, aumenta el tiempo de compilación y el tamaño del programa innecesariamente.
Ese archivo de encabezado no es parte del estándar de C ++, por lo tanto no es portátil, y debe evitarse.
Además, incluso si hubiera un encabezado catch-all en el estándar, querría evitarlo en lugar de encabezados específicos, ya que el compilador tiene que leer y analizar cada encabezado incluido (incluidos los encabezados incluidos recursivamente) cada vez que la unidad de traducción está compilada.
Lamentablemente, ese enfoque no es portátil C ++ (hasta ahora).
Todos los nombres estándar están en el espacio de nombres estándar y, además, no puede saber qué nombres NO están definidos por incluir y encabezado (en otras palabras, es perfectamente legal que una implementación declare el nombre std::string
directa o indirectamente cuando se usa #include <vector>
) .
Sin embargo, a pesar de esto, el idioma le exige que conozca y le diga al compilador qué encabezado estándar incluye qué parte de la biblioteca estándar. Esta es una fuente de errores de portabilidad porque si olvida por ejemplo #include <map>
pero usa std::map
es posible que el programa compile de todos modos de manera silenciosa y sin advertencias en una versión específica de un compilador específico, y puede obtener solo errores más tarde cuando se transfiere a otro compilador o versión.
En mi opinión, no hay excusas técnicas válidas porque esto es necesario para el usuario general: el compilador binario podría tener todo el espacio de nombres estándar integrado y esto podría aumentar el rendimiento incluso más que los encabezados precompilados (por ejemplo, usar algoritmos de hash perfectos para eliminar búsquedas estándar). análisis de encabezados o carga / desasignación, etc.).
El uso de encabezados estándar simplifica la vida de quién crea los compiladores o las bibliotecas estándar, y eso es todo. No es algo para ayudar a los usuarios.
Sin embargo, esta es la forma en que se define el idioma y necesita saber qué encabezado define qué nombres planean que algunas neuronas extra se quemen en configuraciones inútiles para recordar eso (o intente encontrar e IDE que automáticamente agregue los encabezados estándar que usa y elimina los que no tienes ... una alternativa razonable).
#include <bits/stdc++.h>
es un archivo de implementación para un encabezado precompilado.
Desde la perspectiva de la ingeniería de software, es una buena idea minimizar la inclusión. Si lo usa en realidad incluye una gran cantidad de archivos, que su programa puede no necesitar, por lo tanto, aumentar el tiempo de compilación y el tamaño del programa innecesariamente.
Pero en los concursos, el uso de este archivo es una buena idea cuando se quiere reducir el tiempo perdido en hacer las tareas domésticas; especialmente cuando tu rango es sensible al tiempo.
Funciona en la mayoría de los jueces en línea, entornos de concurso de programación, incluyendo ACM-ICPC (subregionales, regionales y finales mundiales) y muchos jueces en línea.
Las desventajas de esto son que
- aumenta el tiempo de compilación.
- utiliza un archivo de encabezado interno no estándar de la biblioteca GNU C ++, y no compilará en MSVC, XCode y muchos otros compiladores