it-swarm.com.de

Warum sollte ich nicht #include <bits / stdc ++. H>?

Ich habe eine Frage mit meinem Code gepostet, deren einziges #include Direktive war die folgende:

#include <bits/stdc++.h>

Mein Lehrer sagte mir, ich solle das tun, aber im Kommentarbereich wurde mir mitgeteilt, dass ich das nicht tun sollte.

Warum?

Das Einfügen von <bits/stdc++.h> Scheint bei Stack Overflow eine immer häufiger vorkommende Sache zu sein, die möglicherweise im laufenden Studienjahr einem nationalen Lehrplan neu hinzugefügt wurde.

Ich stelle mir vor, die Vorteile sind vage so gegeben:

  • Sie müssen nur eine Zeile #include Schreiben
  • Sie müssen nicht nachsehen, in welchem ​​Standardheader sich alles befindet

Leider ist dies ein fauler Hack, der einen internen GCC-Header direkt anstelle einzelner Standardheader wie <string>, <iostream> Und <vector> Benennt. Es ruiniert die Mobilität und fördert schreckliche Gewohnheiten.

Die Nachteile sind:

  • Es wird wahrscheinlich nur auf diesem Compiler funktionieren
  • Sie haben keine Ahnung, was es tun wird, wenn Sie es verwenden, da sein Inhalt nicht durch einen Standard festgelegt wird
  • Selbst ein Upgrade Ihres Compilers auf die nächste eigene Version kann Ihr Programm beschädigen
  • Jeder einzelne Standardheader muss analysiert und zusammen mit Ihrem Quellcode kompiliert werden. Dies ist langsam und führt unter bestimmten Kompilierungseinstellungen zu einer umfangreichen ausführbaren Datei

Tu es nicht!


Mehr Informationen:

Beispiel warum Quora schlecht ist:

Warum? Weil es so verwendet wird, als wäre es ein C++ - Standardheader, aber kein Standard erwähnt es. Ihr Code ist also von Haus aus nicht portierbar. Sie finden keine Dokumentation dazu unter cppreference . Es könnte also genauso gut nicht existieren. Es ist eine Erfindung der Fantasie von jemandem :)

26
Kuba Ober

Es gibt eine Stack Exchange-Site namens Programming Puzzles & Code Golf . Die Programmierpuzzlespiele auf dieser Site passen zu dieser Definition von Puzzle : "ein Spielzeug, ein Problem oder eine andere Erfindung, die von entwickelt wurde, um zu amüsieren Schwierigkeiten aufwerfen, die durch Einfallsreichtum oder geduldige Anstrengung gelöst werden müssen. " Sie sind so konzipiert, dass sie Spaß machen, und nicht so, dass ein arbeitender Programmierer sich über ein reales Problem in seiner täglichen Arbeit amüsiert.

Code Golf ist "eine Art Computerprogrammierungswettbewerb für den Freizeitbereich, bei dem die Teilnehmer bestrebt sind, den kürzestmöglichen Quellcode zu erzielen, der einen bestimmten Algorithmus implementiert." In den Antworten auf der PP & CG-Site sehen Sie, wie Leute die Anzahl der Bytes in ihren Antworten angeben. Wenn sie einen Weg finden, um ein paar Bytes zu sparen, streichen sie die ursprüngliche Nummer heraus und zeichnen die neue auf.

Wie zu erwarten, belohnt Code-Golf extremen Missbrauch von Programmiersprachen. Einbuchstabige Variablennamen. Kein Leerzeichen. Kreative Nutzung von Bibliotheksfunktionen. Undokumentierte Funktionen. Nichtstandardisierte Programmierpraktiken. Schreckliche Hacks.

Wenn ein Programmierer bei der Arbeit eine Pull-Anfrage mit Golf-Style-Code einreichte, wurde diese abgelehnt. Ihre Mitarbeiter würden sie auslachen. Ihr Manager würde an ihrem Schreibtisch vorbeischauen, um sich zu unterhalten. Trotzdem amüsieren sich Programmierer, indem sie Antworten an PP & CG senden.

Was hat das mit stdc ++. H zu tun? Wie andere darauf hingewiesen haben, ist es faul, es zu benutzen. Es ist nicht portierbar, sodass Sie nicht wissen, ob es auf Ihrem Compiler oder der nächsten Version Ihres Compilers funktioniert. Es fördert schlechte Gewohnheiten. Es ist nicht standardisiert, daher kann das Verhalten Ihres Programms von dem abweichen, was Sie erwarten. Dies kann die Kompilierzeit und die ausführbare Größe erhöhen.

Dies sind alles gültige und korrekte Einwände. Warum sollte jemand diese Monstrosität nutzen?

Es stellt sich heraus, dass einige Leute gerne Rätsel programmieren ohne den Code golf . Sie treffen sich und treten bei Veranstaltungen wie ACM-ICPC, Google Code Jam und Facebook Hacker Cup oder auf Websites wie Topcoder und Codeforces gegeneinander an. Ihr Rang basiert auf der Programmkorrektheit, der Ausführungsgeschwindigkeit und der Geschwindigkeit, mit der sie eine Lösung einreichen. Um die Ausführungsgeschwindigkeit zu maximieren, verwenden viele Teilnehmer C++. Um die Codierungsgeschwindigkeit zu maximieren, verwenden einige von ihnen stdc ++. H.

Ist das eine gute Idee? Schauen wir uns die Liste der Nachteile an. Portabilität? Dies spielt keine Rolle, da diese Codierungsereignisse eine bestimmte Compilerversion verwenden, die die Teilnehmer im Voraus kennen. Einhaltung von Standards? Nicht relevant für einen Codeblock, dessen Nutzungsdauer weniger als eine Stunde beträgt. Kompilierzeit und ausführbare Größe? Diese sind nicht Teil der Bewertungsrubrik des Wettbewerbs.

Wir bleiben also mit schlechten Gewohnheiten zurück. Dies ist ein berechtigter Einwand. Durch die Verwendung dieser Header-Datei vermeiden die Teilnehmer, dass sie erfahren, welche Standard-Header-Datei die Funktionen definiert, die sie in ihrem Programm verwenden. Wenn sie echten Code schreiben (und nicht stdc ++. H verwenden), müssen sie Zeit damit verbringen, diese Informationen nachzuschlagen, was bedeutet, dass sie weniger produktiv sind. Das ist der Nachteil beim Üben mit stdc ++. H.

Dies wirft die Frage auf, warum es sich überhaupt lohnt, an wettbewerbsorientierten Programmen teilzunehmen, wenn schlechte Gewohnheiten wie die Verwendung von stdc ++. H und die Verletzung anderer Codierungsstandards gefördert werden. Eine Antwort ist, dass die Leute es aus dem gleichen Grund tun, aus dem sie Programme auf PP & CG veröffentlichen: Einige Programmierer finden es unterhaltsam, ihre Codierungsfähigkeiten in einem spielerischen Kontext einzusetzen.

Die Frage, ob stdc ++. H verwendet werden soll, hängt also davon ab, ob die Vorteile der Codierungsgeschwindigkeit bei einem Programmierwettbewerb die schlechten Angewohnheiten überwiegen, die man bei der Verwendung entwickeln könnte.

Diese Frage lautet: "Warum sollte ich nicht #include <bits/stdc++.h>? "Mir ist klar, dass es gefragt und beantwortet wurde, um einen Punkt zu verdeutlichen, und die akzeptierte Antwort soll die einzig wahre Antwort auf diese Frage sein. Aber die Frage ist nicht" Warum sollte ich nicht #include <bits/stdc++.h> im Produktionscode? "Daher halte ich es für sinnvoll, andere Szenarien in Betracht zu ziehen, in denen die Antwort möglicherweise anders ist.

11
RedGreenCode