He publicado una pregunta con mi código, cuyo único #include directiva fue la siguiente:

#include <bits/stdc++.h>

Mi maestro me dijo que hiciera esto, pero en la sección de comentarios se me informó que yo no debería.

¿Por qué?

  • Eh. Yo debería haber sabido que no iba a ser una versión de using namespace std; por ahí en algún lugar.
  • ¿por qué este encabezado siquiera existen? seguramente ninguno de los estándar incluye el hecho de incluir esta, ya que esto traería en un montón de basura? y si no entra por cualquiera de los públicos incluye… entonces ¿por qué es despachada en la distribución?
  • Es un detalle de implementación. No es parte de la «API pública» o destinada para su uso. Pero todavía tiene que ser enviado de lo contrario nada. La norma incluye no se pueden utilizar de forma individual, sino que está ahí para su uso en los encabezados precompilados. Véase el comentario en la parte de arriba, que dice: «Este es un archivo de implementación para un archivo de encabezado precompilado.».
  • Si usted no debe usar usted mismo, ¿cómo es que su existencia ayudar con PCH? O es gcc lo suficientemente inteligente como para cambiar de forma automática a través de ella para PCH en algunas circunstancias?
  • Buena pregunta. Um, no lo sé realmente, pero que probablemente era lo que yo estaba pensando en sí. Podría ser una buena pregunta en su propio derecho.
  • «No es parte de la «API pública» o destinada para su uso.» Totalmente equivocado, es de uso público, como un archivo de encabezado precompilado. Libstdc++ (pre)se compila e instala una versión precompilada de la cabecera, por lo que si se incluye a continuación, G++ se que en realidad son bits/stdc++.h.gch en cambio, la versión precompilada. Existe porque tiene que existir para que la versión precompilada de que se pueden generar.
  • La API pública de la biblioteca estándar, quiero decir; no de libstdc++. La gente que lo usa en el Desbordamiento de la Pila de cada día (y en sus proyectos) no se utiliza para la razón, o en el caso de uso, de los que usted habla. Seguro, mi comentario podría haber sido redactado de forma más precisa, aunque se nota que me hizo destacar su uso para los encabezados precompilados. Siéntase libre de escribir, a la competencia de respuesta.

3 Comentarios

  1. 229

    Incluyendo <bits/stdc++.h> parece ser cada vez más común ver en Stack Overflow, tal vez algo que acaba de agregar a un plan de estudios nacional en el año académico actual.

    Me imagino que las ventajas son vagamente dado así:

    • Sólo se necesita escribir una #include línea
    • Usted no necesita buscar qué norma de cabecera de todo lo que está en

    Desafortunadamente, este es un perezoso hack, el nombramiento de un GCC cabecera interna directamente en lugar de que los encabezados estándar como <string>, <iostream> y <vector>. Ruinas de la portabilidad y fomenta la terrible hábitos.

    Las desventajas incluyen:

    • Probablemente sólo funcionan en el que el compilador
    • Usted no tiene idea de lo que va a hacer cuando usted lo usa, porque su contenido no están establecidos por una norma
    • Incluso acaba de actualizar su compilador para su propio próxima versión puede romper su programa de
    • Cada encabezado estándar debe ser analizado y recopilado junto con su código fuente, el cual es lento y los resultados en un voluminoso archivo ejecutable bajo ciertas opciones de compilación

    No lo hagas!


    Más información:

    Ejemplo de por qué Quora es malo:

    • «tal vez algo que acaba de agregar a un plan de estudios nacional en el año académico en curso» un Ciego guiando a los ciegos 🙁
    • Exactamente.
    • Bajo ciertas opciones de compilación, sin embargo, el uso de encabezados precompilados va a reducir el tiempo de compilación. También, con la norma del fuera-de-la-ajustes de la caja, me acaba de compilar un trivial programa con y sin #include <bits/stdc++.h> y la diferencia en el tamaño del archivo EXE que se fue del 91 KB con, 89 KB sin.
    • Sólo vine aquí a través de un agujero de gusano en otra pregunta, muy buena. Lo que hace esta enseñanza hábito peor es que es generalmente seguido por un directo using namesapce std;. Sólo dos líneas y en prácticamente todos los niza identificador se utiliza. Muy frustrante ver que está siendo enseñado.
    • Acerca de la quora ejemplo, podría haber cambiado con el tiempo. He visitado la página de hoy y tanto los pros y los contras de <bits/stdc++.h> donde se enumeran en el contexto específico de la línea de concursos de programación. Me encuentro a su conclusión ok-ish.
    • El cuarto de puntos es ventajoso si los encabezados precompilados están en uso. Ver aquí para una explicación, este código es básicamente la versión de gcc de #include "stdafx.h"
    • No, en realidad – sólo porque usted está precompilar los encabezados no significa que usted necesita para precompilar cada encabezado
    • 2KiB es mucho de código, datos, símbolo de información, etc., cuando se trata de determinar su efecto. Hacer que usted entiende todo lo que se va a agregar? Para su compilador? La versión actual? Todas las versiones de entre? Todas las versiones futuras? Si usted necesita decidir entre la conveniencia y la corrección, sólo hay una única opción válida.
    • Esperemos que no sea un plan de estudios sino simplemente una carga culto se extendió a través de concurso de sitios web o algo… aunque, desgraciadamente, nada me sorprendería, de cualquier manera.
    • Un dios no lo quiera usted está usando los encabezados precompilados opción con él. Echa un vistazo a el tamaño de la .pch archivo generado por VS en uno de sus repos/Debug (o Liberación) de los directorios, Que puede ser de decenas a cientos de megabyes.

  2. 26

    ¿Por qué? Porque se usa como si se suponía que iba a ser un estándar de C++ cabecera, pero no hay una norma menciona. Por lo tanto el código no es portable por la construcción. Usted no encontrará ningún tipo de documentación en cppreference. Así que bien podría no existir. Es un producto de la imaginación de alguien 🙂

  3. 11

    Hay un Intercambio de la Pila sitio llamado Programación de Puzzles & Código de Golf. El programación puzzles en ese sitio se ajustan a esta definición de puzzle: «un juguete, problema, u otro mecanismo diseñado para divertir al presentar dificultades para ser resuelto por el ingenio o del esfuerzo del paciente.» Están diseñados para divertir, y no en la forma en que un trabajo de programador podría ser divertido por un problema de la vida real encontrado en su trabajo diario.

    Código De Golf es «un tipo de ocio de programación de computadora de la competencia en la que los participantes se esfuerzan para lograr el plazo más breve posible código fuente que implementa un determinado algoritmo.» En las respuestas sobre la PP&CG sitio, verás a la gente especificar el número de bytes en sus respuestas. Cuando encuentran una manera de afeitarse un par de bytes, que van a la huelga el número original y grabar uno nuevo.

    Como se podría esperar, el código de golf de recompensas de extrema lenguaje de programación abuso. Una carta de los nombres de las variables. Ningún espacio en blanco. El uso creativo de las funciones de la biblioteca. Características no documentadas. No estándar prácticas de programación. Terrible hacks.

    Si un programador presentado una solicitud de extracción en el trabajo que contiene golf de estilo de código, sería rechazado. Sus compañeros se reirían de ellos. Su manager, caería por su puesto por un chat. Aún así, los programadores de divertirse mediante la presentación de respuestas a PP&CG.

    ¿Qué tiene que ver esto con stdc++.h? Como otros han señalado, que el uso es perezoso. No es portátil, así que usted no sabe si va a trabajar en su compilador o la próxima versión de su compilador. Fomenta los malos hábitos. Es no estándar, por lo que su programa de comportamiento puede diferir de lo que usted espera. Se puede incrementar el tiempo de compilación y el tamaño del ejecutable.

    Estos son todos válidos y correctos objeciones. Así que ¿por qué iba alguien a usar esta monstruosidad?

    Resulta que algunas personas, como programación puzzles sin la código de golf. Se reúnen para competir en eventos como el ACM-ICPC, Google Code Jam, y Facebook Hacker Cup, o en sitios como Topcoder y Codeforces. Su clasificación se basa en el programa de corrección, la velocidad de ejecución, y lo rápido que presentar una solución. Para maximizar la velocidad de ejecución, muchos de los participantes el uso de C++. Para maximizar la velocidad de codificación, algunos de ellos de uso stdc++.h.

    Es que esta es una buena idea? Vamos a ver la lista de desventajas. La portabilidad? No importa, ya que estos codificación de los acontecimientos utilizar un compilador específico de la versión que los concursantes de saber de antemano. El cumplimiento de los estándares? No es relevante para un bloque de código cuya vida útil es inferior a una hora. El momento de la compilación y el tamaño del ejecutable? Estos no son parte del concurso de puntuación de la rúbrica.

    Así que nos quedamos con los malos hábitos. Esta es una objeción válida. Mediante el uso de este archivo de encabezado, los concursantes están evitando la oportunidad de aprender que archivo de encabezado estándar define la funcionalidad que está utilizando en su programa. Cuando se está escribiendo en el mundo real de código (y no el uso de stdc++.h) que vas a tener que gastar tiempo buscando esta información, lo que significa que van a ser menos productivos. Esa es la desventaja de practicar con stdc++.h.

    Esto plantea la pregunta de por qué vale la pena tomar parte en la competencia de programación, si se alienta a los malos hábitos como el uso de stdc++.h y violación de otras normas de codificación. Una respuesta es que las personas lo hacen por la misma razón que el post de los programas de PP&CG: algunos programadores encuentran divertido el uso de sus habilidades de codificación en un juego como contexto.

    Así que la pregunta de si el uso de stdc++.h se reduce a si la codificación de los beneficios de la velocidad en un concurso de programación superan a los malos hábitos que uno puede desarrollar mediante el uso de ella.

    Esta pregunta: «¿por Qué no me #include <bits/stdc++.h>?» Me doy cuenta de que se le preguntó y respondió a hacer un punto, y la aceptó respuesta es la intención de ser la única y Verdadera Respuesta a esta pregunta. Pero la pregunta no es «¿por Qué no me #include <bits/stdc++.h> en el código de producción?» Por lo tanto, creo que es razonable considerar otros escenarios donde la respuesta puede ser diferente.

    • He upvoted ya, pero podría ser vale la pena señalar que «por diversión» es una buena razón para tomar parte en la competencia de programación. En el otro lado «para impresionar a un potencial empleador» no – le activamente daño tu caso conmigo.
    • Sé que algunos de los encargados que emplean ver competitiva de experiencia en programación con una bandera roja. Pero mientras las mejores compañías de software de uso CP-estilo de problemas en sus entrevistas y ejecución de concursos de programación para encontrar nuevos reclutas, CP seguirá siendo popular entre los aspirantes a desarrolladores.
    • Yo no soy un administrador (gracias a $DEITY), pero a veces tengo influencia en hireing decisiones. Y yo definitivamente ver cualquier referencia a la «competencia de programación» como un gran bandera roja – no una ventaja.
    • Si la técnica de los entrevistadores en su empresa el uso de algoritmos de puzzles en sus entrevistas (como hacen muchos), que ofrece a los alumnos la competencia de programación de la experiencia de una ventaja. Tal vez la elección racional de los candidatos, para participar en CP pero dejar de mencionar que en su curriculum vitae/CV.

Dejar respuesta

Please enter your comment!
Please enter your name here