wake-up-neo.com

Wie funktioniert #include <bits / stdc ++. H> in C ++?

Ich habe aus einem codeforces Blog gelesen, dass, wenn wir #include <bits/stdc++.h> in einem C++ Dann müssen keine weiteren Header-Dateien hinzugefügt werden. Wie funktioniert #include <bits/stdc++.h> funktioniert und ist es in Ordnung, es zu verwenden, anstatt einzelne Header-Dateien einzuschließen?

104
JerryGoyal

Es ist im Grunde eine Header-Datei, die auch jede Standardbibliothek und STL-Include-Datei enthält. Der einzige Zweck, den ich sehen kann, wäre das Testen und die Ausbildung.

Se z. GCC 4.8.0 /bits/stdc++.h source .

Die Verwendung würde eine Menge unnötiger Dinge beinhalten und die Kompilierungszeit erhöhen.

Bearbeiten: Wie Neil sagt, ist es eine Implementierung für vorkompilierte Header. Wenn Sie die Vorkompilierung korrekt einrichten, kann dies die Kompilierungszeit in Abhängigkeit von Ihrem Projekt beschleunigen. ( https://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html )

Ich empfehle jedoch, dass Sie sich Zeit nehmen, um sich mit den einzelnen sl/stl-Headern vertraut zu machen und sie stattdessen separat einzuschließen. Verwenden Sie "Superheaders" nur zum Zweck der Vorkompilierung.

100
Zelix

#include <bits/stdc++.h> ist eine Implementierungsdatei für einen vorkompilierten Header.

Aus Sicht der Softwareentwicklung ist es eine gute Idee, das Einschließen zu minimieren. Wenn Sie es tatsächlich verwenden, enthält es viele Dateien, die Ihr Programm möglicherweise nicht benötigt, wodurch sowohl die Kompilierungszeit als auch die Programmgröße unnötig erhöht werden. [edit: wie von @Swordfish in den Kommentaren darauf hingewiesen, dass die Größe des Ausgabeprogramms unberührt bleibt. Es hat sich jedoch bewährt, nur die Bibliotheken einzubeziehen, die Sie tatsächlich benötigen, es sei denn, es handelt sich um einen Wettbewerb.]

Bei Wettbewerben ist es jedoch eine gute Idee, diese Datei zu verwenden, wenn Sie die Zeit reduzieren möchten, die für die Erledigung von Aufgaben erforderlich ist. vor allem, wenn Ihr Rang zeitkritisch ist.

Es funktioniert in den meisten Online-Richtern, Programmierwettbewerben, einschließlich ACM-ICPC (Subregionals, Regionals und World Finals) und vielen Online-Richtern.

Die Nachteile davon sind, dass es

  • erhöht die Übersetzungszeit.
  • verwendet eine interne nicht standardmäßige Header-Datei der GNU C++ - Bibliothek und wird daher nicht in MSVC, XCode und vielen anderen Compilern kompiliert
31
abe312

Diese Header-Datei ist nicht Teil des C++ - Standards, daher nicht portierbar und sollte vermieden werden.

Selbst wenn der Standard einige Sammelüberschriften enthalten würde, sollten Sie dies anstelle bestimmter Überschriften vermeiden, da der Compiler jedes Mal, wenn dies der Fall ist, tatsächlich alle enthaltenen Überschriften (einschließlich rekursiv eingeschlossener Überschriften) einlesen und analysieren muss Übersetzungseinheit wird kompiliert.

Es ist im Grunde eine Header-Datei, die jede Standardbibliothek enthält. Bei Programmierwettbewerben ist die Verwendung dieser Datei eine gute Idee, wenn Sie die für die Ausführung von Aufgaben benötigte Zeit reduzieren möchten. vor allem, wenn Ihr Rang zeitkritisch ist. Bei Programmierwettbewerben liegt der Schwerpunkt eher auf der Suche nach Algorithmen zur Lösung eines Problems als auf der Softwareentwicklung. Aus Sicht der Softwareentwicklung ist es eine gute Idee, das Einschließen zu minimieren. Wenn Sie es tatsächlich verwenden, enthält es viele Dateien, die Ihr Programm möglicherweise nicht benötigt, wodurch sowohl die Kompilierungszeit als auch die Programmgröße unnötig erhöht werden. \

besuchen Sie diese für weitere Informationen https://www.geeksforgeeks.org/bitsstdc-h-c/

dies ist das Beste für Online-Codierungen, bei denen es auf den Rang ankommt

3
Vivek Ghanchi

Leider ist dieser Ansatz (bisher) nicht portabel in C++.

Alle Standardnamen sind im Namensraum std und außerdem können Sie nicht wissen, welche Namen NICHT durch Einschließen und Überschrift definiert sind (mit anderen Worten, es ist vollkommen legal) für eine Implementierung, die den Namen std::string direkt oder indirekt bei Verwendung von #include <vector> deklariert.

Trotzdem muss die Sprache dem Compiler mitteilen, welcher Standardheader welchen Teil der Standardbibliothek enthält. Dies ist eine Quelle von Portabilitätsfehlern, denn wenn Sie zum Beispiel #include <map> Vergessen, aber std::map Verwenden, wird das Programm möglicherweise trotzdem still und ohne Warnungen für eine bestimmte Version eines bestimmten Compilers kompiliert Beim Portieren auf einen anderen Compiler oder eine andere Version treten Fehler erst später auf.

Meiner Meinung nach gibt es keine gültigen technischen Ausreden, da dies für den allgemeinen Benutzer erforderlich ist: In der Compiler-Binärdatei könnte der gesamte Standard-Namespace integriert sein, und dies könnte die Leistung sogar noch mehr steigern als bei vorkompilierten Headern (z. B. Verwendung von Perfect Hashing für Lookups, Entfernen von Standard Header Parsing oder Laden/Demarshalling und so weiter).

Die Verwendung von Standardheadern vereinfacht das Leben derer, die Compiler oder Standardbibliotheken erstellen, und das ist alles. Es ist nichts, was den Benutzern helfen könnte.

Dies ist jedoch die Art und Weise, wie die Sprache definiert ist, und Sie müssen wissen, welcher Header welche Namen definiert, damit einige zusätzliche Neuronen in sinnlosen Konfigurationen verbrannt werden können, um sich daran zu erinnern (oder zu versuchen, IDE Dabei werden automatisch die von Ihnen verwendeten Standardüberschriften hinzugefügt und diejenigen entfernt, die Sie nicht verwenden (eine sinnvolle Alternative).

1
6502

Es ist im Grunde eine Header-Datei, die jede Standardbibliothek enthält.
In Programmierwettbewerbe ist es eine gute Idee, diese Datei zu verwenden, wenn Sie die Zeit für die Arbeit reduzieren möchten. vor allem, wenn Ihr Rang zeitkritisch ist.
In Programmierwettbewerben konzentrieren sich die Leute mehr darauf, Algorithmen zu finden, um ein Problem zu lösen, als auf das Software-Engineering.
Aber in Software-Engineering Perspektive ist es keine gute Idee zu verwenden. Wenn Sie es tatsächlich verwenden, enthält es viele Dateien, die Ihr Programm möglicherweise nicht benötigt, wodurch sowohl die Kompilierungszeit als auch die Programmgröße unnötig erhöht werden.

1
Linkon