Mengapa saya tidak # menyertakan <bits / stdc ++. H>?

Aug 05 2015

Saya memposting pertanyaan dengan kode saya yang satu-satunya #includepetunjuknya adalah sebagai berikut:

#include <bits/stdc++.h>

Guru saya menyuruh saya melakukan ini, tetapi di bagian komentar saya diberitahu bahwa saya tidak boleh melakukannya.

Mengapa?

Jawaban

349 LightnessRacesinOrbit Aug 05 2015 at 00:57

Menyertakan <bits/stdc++.h>tampaknya menjadi hal yang semakin umum untuk dilihat di Stack Overflow, mungkin sesuatu yang baru ditambahkan ke kurikulum nasional di tahun akademik saat ini.

Saya membayangkan keuntungan diberikan secara samar-samar sebagai:

  • Anda hanya perlu menulis satu #includebaris
  • Anda tidak perlu mencari di semua header standar mana

Sayangnya, ini adalah peretasan yang lambat, menamai header internal GCC secara langsung, bukan header standar individu seperti <string>, <iostream>dan <vector>. Ini merusak portabilitas dan menumbuhkan kebiasaan buruk.

Kerugiannya meliputi:

  • Ini mungkin hanya akan bekerja pada kompiler itu
  • Anda tidak tahu apa yang akan dilakukannya saat Anda menggunakannya, karena isinya tidak diatur oleh standar
  • Bahkan hanya memutakhirkan kompiler Anda ke versi berikutnya dapat merusak program Anda
  • Setiap tajuk standar harus diurai dan dikompilasi bersama dengan kode sumber Anda, yang lambat dan menghasilkan eksekusi besar di bawah pengaturan kompilasi tertentu

Jangan lakukan itu!


Informasi lebih lanjut:

Contoh mengapa Quora buruk:

67 UnslanderMonica Aug 06 2015 at 23:50

Mengapa? Karena digunakan seolah-olah itu adalah header standar C ++, tetapi tidak ada standar yang menyebutkannya. Jadi, kode Anda tidak portabel menurut konstruksi. Anda tidak akan menemukan dokumentasi apa pun untuk itu di cppreference . Jadi mungkin juga tidak ada. Itu adalah bagian dari imajinasi seseorang :)

Saya telah menemukan - ngeri dan tidak percaya - bahwa ada situs tutorial terkenal di mana setiap contoh C ++ tampaknya menyertakan tajuk ini . Dunia ini gila. Itu buktinya.


Kepada siapa pun yang menulis "tutorial" seperti itu

Harap berhenti menggunakan tajuk ini. Lupakan saja. Jangan menyebarkan kegilaan ini. Jika Anda tidak ingin memahami mengapa melakukan ini adalah Salah , percayalah . Saya tidak baik-baik saja diperlakukan sebagai figur otoritas dalam hal apa pun, dan saya mungkin penuh dengan itu separuh waktu, tetapi saya akan membuat pengecualian dalam satu kasus ini saja. Saya menyatakan bahwa saya tahu apa yang saya bicarakan di sini. Terima kata-kataku. Saya mohon Anda.

PS Saya dapat membayangkan "standar pengajaran" yang menjijikkan di mana gagasan jahat ini mungkin terjadi, dan keadaan yang menyebabkannya. Hanya karena tampaknya ada kebutuhan praktis untuk itu tidak membuatnya dapat diterima - bahkan dalam retrospeksi.

PPS Tidak, tidak ada kebutuhan praktis untuk itu. Tidak banyak header standar C ++, dan mereka terdokumentasi dengan baik. Jika Anda mengajar, Anda merugikan siswa Anda dengan menambahkan "keajaiban" seperti itu. Menghasilkan programmer dengan pola pikir magis adalah hal terakhir yang kami inginkan. Jika Anda perlu menawarkan subset C ++ kepada siswa untuk membuat hidup mereka lebih mudah, cukup buat handout dengan daftar singkat tajuk yang berlaku untuk mata pelajaran yang Anda ajar, dan dengan dokumentasi ringkas untuk konstruksi perpustakaan yang Anda harapkan akan digunakan siswa.

45 RedGreenCode Apr 23 2019 at 08:09

Ada situs Stack Exchange yang disebut Programming Puzzles & Code Golf . The teka-teki pemrograman di situs yang sesuai definisi teka-teki :

mainan, masalah, atau alat lain yang dirancang untuk menghibur dengan menghadirkan kesulitan yang harus diselesaikan dengan kecerdikan atau upaya kesabaran.

Mereka dirancang untuk menghibur, dan tidak seperti programmer yang bekerja mungkin terhibur oleh masalah dunia nyata yang dihadapi dalam pekerjaan sehari-hari mereka.

Code Golf adalah "jenis kompetisi pemrograman komputer rekreasional di mana para peserta berusaha keras untuk mencapai kode sumber sesingkat mungkin yang menerapkan algoritme tertentu." Dalam jawaban di situs PP&CG, Anda akan melihat orang-orang menentukan jumlah byte dalam jawaban mereka. Ketika mereka menemukan cara untuk memangkas beberapa byte, mereka akan mencoret nomor aslinya dan mencatat yang baru.

Seperti yang mungkin Anda duga, golf kode menghargai penyalahgunaan bahasa pemrograman yang ekstrem. Nama variabel satu huruf. Tidak ada spasi. Penggunaan fungsi perpustakaan secara kreatif. Fitur tidak berdokumen. Praktik pemrograman tidak standar. Peretasan yang mengerikan.

Jika seorang programmer mengajukan permintaan tarik di tempat kerja yang berisi kode gaya golf, itu akan ditolak. Rekan kerja mereka akan menertawakan mereka. Manajer mereka akan mampir ke meja mereka untuk mengobrol. Meski begitu, programmer menghibur diri dengan mengirimkan jawaban ke PP&CG.

Apa hubungannya ini stdc++.h? Seperti yang ditunjukkan orang lain, menggunakannya itu malas. Ini non-portabel, jadi Anda tidak tahu apakah ini akan berfungsi pada kompiler Anda atau versi kompiler Anda berikutnya. Ini menumbuhkan kebiasaan buruk. Ini non-standar, jadi perilaku program Anda mungkin berbeda dari yang Anda harapkan. Ini dapat meningkatkan waktu kompilasi dan ukuran yang dapat dieksekusi.

Ini semua adalah keberatan yang sah dan benar. Jadi mengapa ada orang yang menggunakan benda aneh ini?

Ternyata beberapa orang menyukai teka - teki pemrograman tanpa kode golf . Mereka berkumpul dan berkompetisi di acara seperti ACM-ICPC, Google Code Jam, dan Facebook Hacker Cup, atau di situs seperti Topcoder dan Codeforces. Peringkat mereka didasarkan pada ketepatan program, kecepatan eksekusi, dan seberapa cepat mereka mengirimkan solusi. Untuk memaksimalkan kecepatan eksekusi, banyak peserta menggunakan C ++. Untuk memaksimalkan kecepatan pengkodean, beberapa di antaranya menggunakan stdc++.h.

Apakah ini ide yang bagus? Mari kita periksa daftar kerugiannya. Portabilitas? Tidak masalah karena acara pengkodean ini menggunakan versi kompiler khusus yang diketahui kontestan sebelumnya. Kepatuhan standar? Tidak relevan untuk satu blok kode yang masa manfaatnya kurang dari satu jam. Kompilasi waktu dan ukuran yang dapat dieksekusi? Ini bukan bagian dari rubrik penilaian kontes.

Jadi kita dibiarkan dengan kebiasaan buruk. Ini adalah keberatan yang sah. Dengan menggunakan file header ini, kontestan menghindari kesempatan untuk mempelajari file header standar mana yang mendefinisikan fungsionalitas yang mereka gunakan dalam program mereka. Saat mereka menulis kode dunia nyata (dan tidak menggunakan stdc++.h) mereka harus menghabiskan waktu mencari informasi ini, yang berarti mereka akan kurang produktif. Itulah sisi negatif dari berlatih dengan stdc++.h.

Hal ini menimbulkan pertanyaan mengapa layak untuk mengambil bagian dalam pemrograman kompetitif jika itu mendorong kebiasaan buruk seperti menggunakan stdc++.hdan melanggar standar pengkodean lainnya. Satu jawaban adalah bahwa orang melakukannya untuk alasan yang sama mereka memposting program di PP&CG: beberapa programmer merasa senang menggunakan keterampilan pengkodean mereka dalam konteks seperti permainan.

Jadi pertanyaan apakah akan menggunakan stdc++.hturun ke apakah manfaat kecepatan pengkodean dalam kontes pemrograman lebih besar daripada kebiasaan buruk yang mungkin berkembang dengan menggunakannya.

Pertanyaan ini menanyakan: "Mengapa saya tidak #include <bits/stdc++.h>?" Saya menyadari bahwa itu ditanyakan dan dijawab untuk membuat suatu poin, dan jawaban yang diterima dimaksudkan untuk menjadi Satu Jawaban Benar untuk pertanyaan ini. Tetapi pertanyaannya bukanlah "Mengapa saya tidak # menyertakan <bits/stdc++.h>dalam kode produksi?" Oleh karena itu, menurut saya masuk akal untuk mempertimbangkan skenario lain di mana jawabannya mungkin berbeda.

12 Bulletmagnet Nov 03 2019 at 18:39

Dari N4606, Konsep Kerja, Standar untuk Bahasa Pemrograman C ++:

17.6.1.2 Header [header]

  1. Setiap elemen pustaka standar C ++ dideklarasikan atau didefinisikan (sebagaimana mestinya) di header.

  2. Pustaka standar C ++ menyediakan 61 header pustaka C ++, seperti yang ditunjukkan pada Tabel 14.

Tabel 14 - Header library C ++

<algorithm> <future> <numeric> <strstream>
<any> <initializer_list> <optional> <system_error>
<array> <iomanip> <ostream> <thread>
<atomic> <ios> <queue> <tuple>
<bitset> <iosfwd> <random> <type_traits>
<chrono> <iostream> <ratio> <typeindex>
<codecvt> <istream> <regex> <typeinfo>
<complex> <iterator> <scoped_allocator> <unordered_map>
<condition_variable> <limits> <set> <unordered_set>
<deque> <list> <shared_mutex> <utility>
<exception> <locale> <sstream> <valarray>
<execution> <map> <stack> <variant>
<filesystem> <memory> <stdexcept> <vector>
<forward_list> <memory_resorce> <streambuf>
<fstream> <mutex> <string>
<functional> <new> <string_view>

Tidak ada <bits / stdc ++. H> di sana. Ini tidak mengherankan, karena header <bits / ...> adalah detail implementasi, dan biasanya membawa peringatan:

*  This is an internal header file, included by other library headers.
*  Do not attempt to use it directly. 

<bits / stdc ++. h> juga membawa peringatan:

*  This is an implementation file for a precompiled header.
2 YunfeiChen Jul 08 2020 at 07:20

Alasan kami tidak menggunakan:

#include <bits/stdc++.h>

adalah karena efisiensi. Izinkan saya membuat analogi: Untuk Anda yang mengetahui Java: Jika Anda bertanya kepada instruktur Anda apakah yang berikut ini adalah ide yang bagus, kecuali jika mereka adalah instruktur yang buruk, mereka akan mengatakan tidak:

import java.*.*

Hal #include ... pada dasarnya melakukan hal yang sama ... Itu bukan satu-satunya alasan untuk tidak menggunakannya, tetapi ini adalah salah satu alasan utama untuk tidak menggunakannya. Untuk analogi kehidupan nyata: Bayangkan Anda memiliki perpustakaan dan Anda ingin meminjam beberapa buku dari perpustakaan, apakah Anda akan merelokasi seluruh perpustakaan di sebelah rumah Anda ?? Ini akan mahal dan tidak efisien. Jika Anda hanya membutuhkan 5 buku, maka cukup keluarkan 5 ... Bukan seluruh perpustakaan .....

#include <bits/stdc++.h>

Tampak nyaman dengan tampilan program Saya hanya perlu mengetik satu pernyataan include dan berfungsi, sama halnya dengan memindahkan seluruh perpustakaan, lihat saya hanya perlu memindahkan satu perpustakaan utuh bukan 5 buku, satu per satu. Tampak nyaman bagi Anda, bagi orang yang benar-benar harus melakukan pemindahan ?? Tidak terlalu banyak, dan coba tebak dalam C ++ orang yang melakukan pemindahan adalah komputer Anda ... Komputer tidak akan menikmati pemindahan seluruh pustaka untuk setiap file sumber yang Anda tulis:) .....