Saya mengirim pertanyaan dengan kode saya yang hanya #include
direktif adalah sebagai berikut:
#include <bits/stdc++.h>
Guru saya mengatakan kepada saya untuk melakukan hal ini, tapi di bagian komentar saya diberitahu bahwa saya seharusnya't.
Mengapa?
Termasuk <bit/berinteraksi dengan perangkat keras++.h>
tampaknya menjadi hal yang semakin umum untuk melihat Stack Overflow, mungkin sesuatu yang baru ditambahkan ke kurikulum nasional pada tahun ajaran saat ini.
Saya membayangkan keuntungan yang samar-samar mengingat demikian:
#include
lineSayangnya, ini adalah malas hack, penamaan GCC internal header secara langsung, bukan individu standard header seperti <string>
, <iostream>
dan <vektor>
. Reruntuhan portabilitas dan menumbuhkan kebiasaan buruk.
Kerugian meliputi:
Don't melakukan itu!
Informasi lebih lanjut:
Contoh mengapa Quora buruk:
Mengapa? Karena digunakan seolah-olah itu seharusnya menjadi C++ header standar, tetapi tidak ada standar yang menyebutkan itu. Sehingga kode anda adalah non-portabel dengan konstruksi. Anda memenangkan't menemukan dokumentasi untuk itu pada cppreference. Jadi itu mungkin juga tidak ada. It's isapan jempol dari seseorang's imajinasi :)
Ada's Stack Exchange situs yang disebut Pemrograman teka-Teki & Kode Golf. Yang pemrograman teka-teki pada situs tersebut sesuai dengan definisi ini dari teka-teki:
mainan, masalah, atau penemuan yang dirancang untuk menghibur dengan menghadirkan kesulitan yang harus dipecahkan oleh kecerdikan atau pasien usaha.
Mereka dirancang untuk menghibur, dan tidak dalam cara yang kerja programmer bisa terhibur dengan dunia nyata masalah yang dihadapi dalam pekerjaan sehari-hari mereka.
Kode: Golf adalah "suatu jenis hiburan komputer kompetisi pemrograman di mana peserta berusaha untuk mencapai waktu yang sesingkat mungkin source code yang mengimplementasikan algoritma tertentu." Dalam jawaban pada PP&CG situs ini, anda'll melihat orang-orang yang menentukan jumlah byte dalam jawaban mereka. Ketika mereka menemukan cara untuk mencukur beberapa byte, mereka'll mencoret nomor asli dan merekam yang baru.
Seperti yang mungkin anda harapkan, kode golf imbalan ekstrim bahasa pemrograman penyalahgunaan. Satu-huruf-nama variabel. Tidak ada spasi. Penggunaan kreatif dari fungsi perpustakaan. Fitur yang tidak berdokumen. Tidak standar praktek pemrograman. Mengerikan hacks.
Jika seorang programmer mengajukan permintaan tarik di tempat kerja yang mengandung golf-kode gaya, itu akan ditolak. Rekan kerja mereka akan menertawakan mereka. Manajer mereka akan mampir di meja mereka untuk mengobrol. Meski begitu, programmer menghibur diri dengan mengirimkan jawaban ke PP&CG.
Apa ini ada hubungannya dengan berinteraksi dengan perangkat keras++.h
? Seperti orang lain telah menunjukkan, menggunakan itu malas. It's non-portabel, sehingga anda don't tahu apakah itu akan bekerja pada anda compiler atau versi selanjutnya dari kompiler anda. Ini menumbuhkan kebiasaan buruk. It's non-standar, sehingga program anda's perilaku yang mungkin berbeda dari apa yang anda harapkan. Hal ini dapat meningkatkan waktu kompilasi dan eksekusi ukuran.
Ini semua adalah valid dan benar keberatan. Jadi mengapa ada orang yang menggunakan alat aneh ini?
Ternyata bahwa beberapa orang suka pemrograman teka-teki tanpa kode golf. Mereka bersama-sama 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 program ketepatan, kecepatan eksekusi, dan seberapa cepat mereka mengajukan solusi. Untuk memaksimalkan kecepatan eksekusi, banyak peserta yang menggunakan C++. Untuk memaksimalkan coding kecepatan, beberapa dari mereka menggunakan berinteraksi dengan perangkat keras++.jam
.
Ini adalah ide yang baik? Let's cek daftar kerugian. Portabilitas? Itu doesn't peduli karena ini coding peristiwa penggunaan tertentu compiler versi kontestan yang tahu di muka. Kepatuhan terhadap standar? Tidak relevan untuk blok kode yang hidupnya kurang dari satu jam. Waktu kompilasi dan eksekusi ukuran? Ini bukanlah't bagian dari kontes's scoring rubric.
Jadi kita're kiri dengan kebiasaan buruk. Ini adalah keberatan yang sah. Dengan menggunakan ini file header, kontestan menghindari kesempatan untuk belajar yang standar file header ini mendefinisikan fungsi mereka're menggunakan dalam program mereka. Ketika mereka're menulis dunia nyata code (dan tidak menggunakan berinteraksi dengan perangkat keras++.h
) mereka'll harus menghabiskan waktu mencari informasi ini, yang berarti mereka'll menjadi kurang produktif. Yang's the downside berlatih dengan berinteraksi dengan perangkat keras++.jam
.
Hal ini menimbulkan pertanyaan mengapa hal itu's layak mengambil bagian di kompetisi pemrograman di semua jika itu mendorong kebiasaan buruk seperti menggunakan berinteraksi dengan perangkat keras++.h
dan lain melanggar standar coding. Salah satu jawabannya adalah bahwa orang-orang melakukannya untuk alasan yang sama mereka pasca program PP&CG: beberapa programmer menemukan itu menyenangkan untuk menggunakan keterampilan coding dalam permainan-seperti konteks.
Jadi pertanyaan apakah untuk menggunakan berinteraksi dengan perangkat keras++.h
turun apakah coding, kecepatan angin dan manfaat dalam pemrograman sebuah kontes yang lebih besar daripada kebiasaan buruk yang satu mungkin mengembangkan dengan menggunakan itu.
Pertanyaan ini bertanya: "Mengapa saya harus tidak #include <bit/berinteraksi dengan perangkat keras++.h>
?" saya menyadari bahwa itu adalah bertanya dan menjawab untuk membuat titik, dan jawaban yang diterima adalah dimaksudkan untuk menjadi salah Satu Jawaban yang Benar untuk pertanyaan ini. Tapi pertanyaannya isn't "Mengapa saya harus tidak #include <bit/berinteraksi dengan perangkat keras++.h>
dalam kode produksi?" oleh Karena itu, saya pikir itu's yang wajar untuk mempertimbangkan skenario lain di mana jawabannya mungkin berbeda.
Dari N4606, Rancangan Kerja, Standar untuk Bahasa Pemrograman C++ :
17.6.1.2 Header [header]
Setiap elemen dari C++ standar library dinyatakan atau didefinisikan (sesuai) dalam header.
C++ standar library menyediakan 61 C++ library header, seperti yang ditunjukkan pada Tabel 14.
Tabel 14 — C++ library header
<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>
Ada's tidak ada <bit/berinteraksi dengan perangkat keras++.h> di sana. Hal ini tidak mengherankan, karena <bit/...> header detail implementasi, dan biasanya membawa peringatan:
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly.
<bit/berinteraksi dengan perangkat keras++.h> juga membawa peringatan:
* This is an implementation file for a precompiled header.