Saya memposting pertanyaan dengan kode saya yang hanya #include
direktif sebagai berikut:
#include <bits/stdc++.h>
Guru saya menyuruh saya melakukan ini, tetapi di bagian komentar saya diberi tahu bahwa saya tidak boleh melakukannya.
Mengapa?
c++
portability
turbo-c++
c++-faq
implementation-defined-behavior
Lightness Races di Orbit
sumber
sumber
using namespace std;
luar sana.bits/stdc++.h.gch
, versi yang dikompilasi. Itu ada karena harus ada sehingga versi yang telah dikompilasi dapat dihasilkan.Jawaban:
Termasuk
<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 yang diberikan secara samar:
#include
barisSayangnya, ini adalah hack malas, menamai header internal GCC langsung daripada header standar individu seperti
<string>
,<iostream>
dan<vector>
. Ini merusak portabilitas dan menumbuhkan kebiasaan buruk.Kerugiannya termasuk:
Jangan lakukan itu!
Informasi lebih lanjut:
Contoh mengapa Quora buruk:
sumber
using namesapce std;
. Hanya dua baris dan hampir setiap pengenal yang bagus digunakan. Sangat frustasi melihatnya diajarkan.Mengapa? Karena digunakan seolah-olah itu seharusnya header standar C ++, tetapi tidak ada standar yang menyebutkannya. Jadi kode Anda tidak portabel dengan konstruksi. Anda tidak akan menemukan dokumentasi untuk itu di cppreference . Jadi mungkin juga tidak ada. Itu isapan jempol dari imajinasi seseorang :)
Saya telah menemukan - yang membuat saya ngeri dan tidak percaya - bahwa ada situs tutorial terkenal di mana setiap contoh C ++ sepertinya menyertakan header ini . Dunia ini gila. Itu buktinya.
Untuk siapa pun yang menulis "tutorial" seperti itu
Harap berhenti menggunakan tajuk ini. Lupakan saja. Jangan menyebarkan kegilaan ini. Jika Anda tidak mau mengerti mengapa melakukan ini salah , terima kata-kata saya. Saya tidak apa-apa diperlakukan sebagai figur otoritas pada apa pun, dan saya mungkin sudah separuh waktu, tetapi saya akan membuat pengecualian dalam kasus ini saja. Saya mengklaim bahwa saya tahu apa yang saya bicarakan di sini. Bawa saya pada kata saya. Saya mohon Anda.
PS Saya bisa membayangkan "standar pengajaran" yang keji di mana ide jahat ini mungkin terjadi, dan keadaan yang menyebabkannya. Hanya karena tampaknya ada kebutuhan praktis untuk itu tidak membuatnya diterima - bahkan dalam retrospeksi.
PPS Tidak, tidak ada kebutuhan praktis untuk itu. Tidak ada banyak header standar C ++, dan mereka didokumentasikan dengan baik. Jika Anda mengajar, Anda merugikan siswa dengan menambahkan "sihir" seperti itu. Memproduksi programmer dengan pola pikir magis adalah hal terakhir yang kami inginkan. Jika Anda perlu menawarkan kepada siswa subset C ++ untuk membuat hidup mereka lebih mudah, cukup buat selebaran dengan daftar pendek tajuk yang berlaku untuk kursus yang Anda ajarkan, dan dengan dokumentasi ringkas untuk konstruksi perpustakaan yang Anda harapkan akan digunakan siswa.
sumber
Ada situs Stack Exchange yang disebut Programming Puzzles & Code Golf . The teka-teki pemrograman di situs yang sesuai definisi teka-teki :
Mereka dirancang untuk menghibur, dan tidak sedemikian rupa sehingga programmer yang bekerja mungkin terhibur dengan masalah dunia nyata yang dihadapi dalam pekerjaan sehari-hari mereka.
Code Golf adalah "jenis kompetisi pemrograman komputer rekreasi di mana peserta berusaha untuk mencapai kode sumber sesingkat mungkin yang mengimplementasikan algoritma tertentu." Di 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 Anda duga, kode golf memberikan penghargaan pada penyalahgunaan bahasa pemrograman ekstrem. Nama variabel satu huruf. Tanpa spasi putih. Penggunaan fungsi perpustakaan secara kreatif. Fitur tidak berdokumen. Praktek pemrograman yang tidak standar. Retas 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 di meja mereka untuk mengobrol. Meski begitu, pemrogram menghibur diri dengan mengirimkan jawaban ke PP&CG.
Apa hubungannya ini
stdc++.h
? Seperti yang orang lain tunjukkan, menggunakannya itu malas. Ini non-portabel, jadi Anda tidak tahu apakah itu akan bekerja pada kompiler Anda atau versi kompiler Anda berikutnya. Ini menumbuhkan kebiasaan buruk. Ini bukan 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 kebodohan ini?
Ternyata beberapa orang menyukai pemrograman puzzle tanpa kode golf . Mereka berkumpul dan bersaing di acara-acara seperti ACM-ICPC, Google Code Jam, dan Facebook Hacker Cup, atau di situs-situs seperti Topcoder dan Codeforces. Peringkat mereka didasarkan pada kebenaran program, kecepatan eksekusi, dan seberapa cepat mereka mengirimkan solusi. Untuk memaksimalkan kecepatan eksekusi, banyak peserta menggunakan C ++. Untuk memaksimalkan kecepatan pengkodean, beberapa di antaranya digunakan
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 oleh para kontestan sebelumnya. Kepatuhan standar? Tidak relevan untuk satu blok kode yang masa pakainya 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 mengetahui file header standar mana yang mendefinisikan fungsionalitas yang mereka gunakan dalam program mereka. Ketika mereka menulis kode dunia nyata (dan tidak menggunakan
stdc++.h
) mereka harus menghabiskan waktu mencari informasi ini, yang berarti mereka akan kurang produktif. Itulah kelemahan berlatih denganstdc++.h
.Hal ini menimbulkan pertanyaan mengapa layak untuk ikut serta dalam pemrograman kompetitif jika mendorong kebiasaan buruk seperti menggunakan
stdc++.h
dan melanggar standar pengkodean lainnya. Salah satu jawabannya adalah bahwa orang melakukannya karena alasan yang sama dengan mereka memposting program pada PP&CG: beberapa programmer merasa senang menggunakan keterampilan pengkodean mereka dalam konteks seperti gim.Jadi pertanyaan apakah akan digunakan
stdc++.h
turun ke apakah manfaat kecepatan pengkodean dalam kontes pemrograman melebihi kebiasaan buruk yang mungkin dikembangkan dengan menggunakannya.Pertanyaan ini bertanya: "Mengapa saya tidak harus # mencantumkan
<bits/stdc++.h>
?" Saya menyadari bahwa itu ditanyakan dan dijawab untuk menegaskan, dan jawaban yang diterima dimaksudkan sebagai Satu Jawaban Sejati untuk pertanyaan ini. Tetapi pertanyaannya bukan "Mengapa saya tidak memasukkan #<bits/stdc++.h>
kode produksi?" Karena itu, saya pikir masuk akal untuk mempertimbangkan skenario lain di mana jawabannya mungkin berbeda.sumber
Dari N4606, Working Draft, Standar untuk Bahasa Pemrograman C ++:
17.6.1.2 Header [tajuk]
Setiap elemen dari pustaka standar C ++ dideklarasikan atau didefinisikan (sebagaimana mestinya) di header.
Pustaka standar C ++ menyediakan 61 header pustaka C ++, seperti yang ditunjukkan pada Tabel 14.
Tabel 14 - C ++ header header
Tidak ada <bits / stdc ++. H> di sana. Ini tidak mengejutkan, karena tajuk <bit / ...> adalah detail implementasi, dan biasanya membawa peringatan:
<bits / stdc ++. h> juga membawa peringatan:
sumber