ทำไมฉันจึงไม่ # รวม <bits / stdc ++. h>

Aug 05 2015

ฉันโพสต์คำถามพร้อมรหัสของฉันซึ่งมี#includeคำสั่งเพียงอย่างเดียวดังต่อไปนี้:

#include <bits/stdc++.h>

ครูของฉันบอกให้ฉันทำ แต่ในส่วนความคิดเห็นฉันได้รับแจ้งว่าฉันไม่ควรทำ

ทำไม?

คำตอบ

349 LightnessRacesinOrbit Aug 05 2015 at 00:57

การรวมถึง<bits/stdc++.h>ดูเหมือนจะเป็นเรื่องปกติมากขึ้นที่จะเห็นใน Stack Overflow บางทีอาจเป็นสิ่งที่เพิ่มเข้ามาใหม่ในหลักสูตรระดับชาติในปีการศึกษาปัจจุบัน

ฉันคิดว่าข้อดีจะได้รับอย่างคลุมเครือ:

  • คุณต้องเขียนเพียง#includeบรรทัดเดียว
  • คุณไม่จำเป็นต้องค้นหาว่าทุกอย่างอยู่ในส่วนหัวมาตรฐานใด

แต่น่าเสียดายที่นี้เป็นสับขี้เกียจตั้งชื่อ GCC หัวภายในโดยตรงแทนหัวมาตรฐานของแต่ละบุคคลเช่น<string>, และ<iostream> <vector>มันทำลายการพกพาและส่งเสริมนิสัยที่แย่มาก

ข้อเสีย ได้แก่ :

  • มันอาจจะใช้ได้เฉพาะกับคอมไพเลอร์นั้น
  • คุณไม่รู้ว่าจะทำอย่างไรเมื่อใช้งานเนื่องจากเนื้อหาไม่ได้กำหนดโดยมาตรฐาน
  • แม้แต่การอัปเกรดคอมไพเลอร์ของคุณเป็นเวอร์ชันถัดไปอาจทำให้โปรแกรมของคุณเสียหายได้
  • ทุกส่วนหัวมาตรฐานจะต้องได้รับการแยกวิเคราะห์และรวบรวมพร้อมกับซอร์สโค้ดของคุณซึ่งช้าและส่งผลให้มีการเรียกใช้งานขนาดใหญ่ภายใต้การตั้งค่าการรวบรวมบางอย่าง

อย่าทำ!


ข้อมูลมากกว่านี้:

ตัวอย่างสาเหตุที่ Quora ไม่ดี:

67 UnslanderMonica Aug 06 2015 at 23:50

ทำไม? เพราะมันถูกใช้ราวกับว่ามันควรจะเป็นส่วนหัวมาตรฐาน C ++ แต่ไม่มีมาตรฐานกล่าวถึง ดังนั้นรหัสของคุณจึงไม่สามารถพกพาได้โดยการก่อสร้าง คุณจะไม่พบเอกสารใด ๆ สำหรับมันในcppreference ดังนั้นมันก็อาจไม่มีอยู่จริงเช่นกัน มันเป็นจินตนาการของใครบางคน :)

ฉันได้ค้นพบ - ถึงความน่ากลัวและความไม่เชื่อของฉัน - มีไซต์การสอนที่เป็นที่รู้จักซึ่งทุกตัวอย่าง C ++ ดูเหมือนจะรวมส่วนหัวนี้ไว้ด้วย โลกกำลังบ้าคลั่ง นั่นคือข้อพิสูจน์


สำหรับทุกคนที่เขียน "บทแนะนำ" ดังกล่าว

โปรดหยุดใช้ส่วนหัวนี้ ลืมมันซะ. อย่าเผยแพร่ความวิกลจริตนี้ หากคุณไม่ต้องการที่จะเข้าใจว่าทำไมการทำเช่นนี้จึงผิดโปรดใช้คำของฉันแทน ฉันไม่เห็นด้วยกับการถูกมองว่าเป็นผู้มีอำนาจในสิ่งใด ๆ ทั้งสิ้นและฉันอาจจะเต็มครึ่งเวลา แต่ฉันจะยกเว้นในกรณีนี้เท่านั้น ฉันอ้างว่าฉันรู้ว่าฉันกำลังพูดถึงอะไรที่นี่ พาฉันไปตามคำพูดของฉัน ฉันขอร้องคุณ

ป.ล. ฉันนึกภาพออกได้ดีถึง "มาตรฐานการสอน" ที่น่าสะอิดสะเอียนซึ่งความคิดชั่วร้ายนี้อาจเกิดขึ้นและสถานการณ์ที่นำไปสู่ เพียงเพราะดูเหมือนว่ามีความจำเป็นในทางปฏิบัติจึงไม่ได้ทำให้เป็นที่ยอมรับ - ไม่แม้แต่จะหวนกลับ

PPS ไม่จำเป็นต้องใช้ในทางปฏิบัติ ส่วนหัวมาตรฐาน C ++ มีไม่มากนักและได้รับการบันทึกไว้เป็นอย่างดี หากคุณสอนคุณกำลังทำให้นักเรียนของคุณเสียหายโดยการเพิ่ม "เวทมนตร์" ดังกล่าว การผลิตโปรแกรมเมอร์ด้วยความคิดที่มหัศจรรย์เป็นสิ่งสุดท้ายที่เราต้องการ หากคุณต้องการเสนอชุดย่อยของ C ++ ให้นักเรียนเพื่อให้ชีวิตง่ายขึ้นเพียงแค่จัดทำเอกสารประกอบคำบรรยายโดยมีรายการส่วนหัวสั้น ๆ ที่เกี่ยวข้องกับหลักสูตรที่คุณสอนและเอกสารที่กระชับสำหรับโครงสร้างห้องสมุดที่คุณคาดหวังให้นักเรียนใช้

45 RedGreenCode Apr 23 2019 at 08:09

มีเว็บไซต์ Stack แลกเปลี่ยนเรียกว่าเป็นโปรแกรมปริศนาและรหัสกอล์ฟ ปริศนาการเขียนโปรแกรมบนเว็บไซต์ที่เหมาะสมกับความหมายของการนี้ปริศนา :

ของเล่นปัญหาหรือสิ่งประดิษฐ์อื่น ๆ ที่ออกแบบมาเพื่อสร้างความขบขันโดยนำเสนอปัญหาที่แก้ไขได้โดยความเฉลียวฉลาดหรือความพยายามของผู้ป่วย

พวกเขาได้รับการออกแบบมาเพื่อสร้างความขบขันและไม่ใช่วิธีที่โปรแกรมเมอร์ที่ทำงานอาจรู้สึกขบขันกับปัญหาในโลกแห่งความเป็นจริงที่พบในงานประจำวัน

Code Golfคือ "การแข่งขันการเขียนโปรแกรมคอมพิวเตอร์เพื่อการพักผ่อนหย่อนใจประเภทหนึ่งที่ผู้เข้าร่วมพยายามที่จะบรรลุซอร์สโค้ดที่สั้นที่สุดเท่าที่จะเป็นไปได้ซึ่งใช้อัลกอริทึมบางอย่าง" ในคำตอบบนไซต์ PP&CG คุณจะเห็นผู้คนระบุจำนวนไบต์ในคำตอบ เมื่อพวกเขาพบวิธีที่จะกำจัดออกไปสองสามไบต์พวกเขาจะขีดฆ่าหมายเลขเดิมและบันทึกหมายเลขใหม่

อย่างที่คุณคาดหวังการตีกอล์ฟจะให้รางวัลกับการใช้ภาษาโปรแกรมในทางที่ผิด ชื่อตัวแปรตัวอักษรเดียว ไม่มีช่องว่าง การใช้ฟังก์ชันห้องสมุดอย่างสร้างสรรค์ คุณสมบัติที่ไม่มีเอกสาร แนวทางปฏิบัติในการเขียนโปรแกรมที่ไม่เป็นไปตามมาตรฐาน แฮ็กที่น่ากลัว

หากโปรแกรมเมอร์ส่งคำขอดึงในที่ทำงานที่มีรหัสแบบกอล์ฟก็จะถูกปฏิเสธ เพื่อนร่วมงานจะหัวเราะเยาะพวกเขา ผู้จัดการของพวกเขาจะแวะที่โต๊ะเพื่อคุยกัน ถึงกระนั้นโปรแกรมเมอร์ก็ยังสนุกกับตัวเองด้วยการส่งคำตอบให้กับ PP&CG

สิ่งนี้เกี่ยวข้องกับstdc++.hอะไร? อย่างที่คนอื่น ๆ ชี้ไว้การใช้มันขี้เกียจ ไม่ใช่แบบพกพาดังนั้นคุณจึงไม่รู้ว่าจะใช้งานได้กับคอมไพเลอร์หรือคอมไพเลอร์เวอร์ชันถัดไป เป็นการส่งเสริมนิสัยที่ไม่ดี ไม่เป็นไปตามมาตรฐานดังนั้นพฤติกรรมของโปรแกรมของคุณอาจแตกต่างไปจากที่คุณคาดหวัง อาจเพิ่มเวลาในการคอมไพล์และขนาดปฏิบัติการ

สิ่งเหล่านี้เป็นการคัดค้านที่ถูกต้องและถูกต้อง แล้วทำไมทุกคนถึงใช้ความโหดร้ายนี้?

แต่กลับกลายเป็นว่าบางคนชอบปริศนาการเขียนโปรแกรมโดยไม่ต้องกอล์ฟรหัส พวกเขามารวมตัวกันและแข่งขันในงานต่างๆเช่น ACM-ICPC, Google Code Jam และ Facebook Hacker Cup หรือในเว็บไซต์เช่น Topcoder และ Codeforces อันดับของพวกเขาขึ้นอยู่กับความถูกต้องของโปรแกรมความเร็วในการดำเนินการและความเร็วที่พวกเขาส่งโซลูชัน เพื่อเพิ่มความเร็วในการดำเนินการผู้เข้าร่วมจำนวนมากใช้ C ++ stdc++.hเพื่อเพิ่มความเร็วในการเข้ารหัสบางส่วนของพวกเขาใช้

นี่เป็นความคิดที่ดีหรือไม่? ลองตรวจสอบรายการข้อเสีย พกพา? ไม่สำคัญเนื่องจากเหตุการณ์การเข้ารหัสเหล่านี้ใช้เวอร์ชันคอมไพเลอร์เฉพาะที่ผู้เข้าแข่งขันทราบล่วงหน้า การปฏิบัติตามมาตรฐาน? ไม่เกี่ยวข้องกับบล็อกโค้ดที่มีอายุการใช้งานน้อยกว่าหนึ่งชั่วโมง เวลารวบรวมและขนาดปฏิบัติการ? สิ่งเหล่านี้ไม่ได้เป็นส่วนหนึ่งของเกณฑ์การให้คะแนนของการแข่งขัน

เราก็เลยนิสัยแย่ ๆ นี่คือการคัดค้านที่ถูกต้อง การใช้ไฟล์ส่วนหัวนี้ทำให้ผู้เข้าแข่งขันหลีกเลี่ยงโอกาสที่จะเรียนรู้ว่าไฟล์ส่วนหัวมาตรฐานใดที่กำหนดฟังก์ชันการทำงานที่ใช้ในโปรแกรมของตน เมื่อพวกเขาเขียนโค้ดในโลกแห่งความเป็นจริง (และไม่ได้ใช้งานstdc++.h) พวกเขาจะต้องใช้เวลาในการค้นหาข้อมูลนี้ซึ่งหมายความว่าจะมีประสิทธิผลน้อยลง stdc++.hนั่นคือข้อเสียของการฝึกด้วย

สิ่งนี้ทำให้เกิดคำถามว่าเหตุใดจึงควรมีส่วนร่วมในการเขียนโปรแกรมเชิงแข่งขันหากมีการส่งเสริมนิสัยที่ไม่ดีเช่นการใช้stdc++.hและละเมิดมาตรฐานการเข้ารหัสอื่น ๆ คำตอบหนึ่งคือผู้คนทำด้วยเหตุผลเดียวกับที่โพสต์โปรแกรมบน PP&CG: โปรแกรมเมอร์บางคนพบว่าการใช้ทักษะการเขียนโค้ดในบริบทที่เหมือนเกมเป็นเรื่องสนุก

ดังนั้นคำถามที่ว่าจะนำstdc++.hมาใช้นั้นขึ้นอยู่กับว่าความเร็วในการเข้ารหัสมีประโยชน์หรือไม่ในการแข่งขันการเขียนโปรแกรมมีมากกว่านิสัยที่ไม่ดีที่อาจเกิดขึ้นจากการใช้งาน

คำถามนี้ถามว่า: "ทำไมฉันจึงไม่ # รวม<bits/stdc++.h>" ฉันตระหนักดีว่ามีการถามและตอบเพื่อให้เป็นประเด็นและคำตอบที่ได้รับการยอมรับนั้นตั้งใจจะเป็นคำตอบที่แท้จริงของคำถามนี้ แต่คำถามไม่ใช่ "ทำไมฉันจึงไม่ # รวม<bits/stdc++.h>อยู่ในรหัสการผลิต" ดังนั้นฉันคิดว่ามันสมเหตุสมผลที่จะพิจารณาสถานการณ์อื่น ๆ ที่คำตอบอาจแตกต่างกัน

12 Bulletmagnet Nov 03 2019 at 18:39

จาก N4606, Working Draft, Standard for Programming Language C ++:

17.6.1.2 ส่วนหัว [ส่วนหัว]

  1. แต่ละองค์ประกอบของไลบรารีมาตรฐาน C ++ ถูกประกาศหรือกำหนด (ตามความเหมาะสม) ในส่วนหัว

  2. ไลบรารีมาตรฐาน C ++ ให้ 61 ส่วนหัวของไลบรารี C ++ ดังแสดงในตารางที่ 14

ตารางที่ 14 - ส่วนหัวของไลบรารี 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>

ไม่มี <bits / stdc ++. h> ที่นั่น ไม่น่าแปลกใจเนื่องจากส่วนหัว <bits / ... > เป็นรายละเอียดการใช้งานและมักจะมีคำเตือน:

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

<bits / stdc ++. h> ยังมีคำเตือน:

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

เหตุผลที่เราไม่ใช้:

#include <bits/stdc++.h>

เป็นเพราะประสิทธิภาพ ให้ฉันเปรียบเทียบ: สำหรับผู้ที่รู้จัก Java: หากคุณถามผู้สอนว่าสิ่งต่อไปนี้เป็นความคิดที่ดีหรือไม่เว้นแต่พวกเขาจะเป็นผู้สอนที่ไม่ดีพวกเขาจะตอบว่าไม่:

import java.*.*

สิ่งที่ #include ... ทำในสิ่งเดียวกันโดยพื้นฐาน ... นั่นไม่ใช่เหตุผลเดียวที่จะไม่ใช้มัน แต่เป็นหนึ่งในเหตุผลสำคัญที่จะไม่ใช้มัน สำหรับการเปรียบเทียบในชีวิตจริง: ลองนึกภาพคุณมีห้องสมุดและคุณต้องการยืมหนังสือสองสามเล่มจากห้องสมุดคุณจะย้ายห้องสมุดทั้งหมดที่อยู่ติดกับบ้านของคุณหรือไม่? มันจะแพงและไม่คุ้มค่า ถ้าต้องการแค่ 5 เล่มก็เอาออกไปแค่ 5 เล่ม ... ไม่ใช่ทั้งห้องสมุด .....

#include <bits/stdc++.h>

ดูน่าพึงพอใจกับรูปลักษณ์ของโปรแกรมฉันต้องพิมพ์คำสั่ง include หนึ่งรายการและใช้งานได้เช่นเดียวกับการย้ายห้องสมุดทั้งหมดดูเหมือนว่าฉันจะต้องย้ายห้องสมุดทั้งหมดแทนที่จะเป็นหนังสือ 5 เล่มทีละเล่ม ดูน่ารักสำหรับคุณนั่นคือสำหรับคนที่ต้องย้ายจริง ๆ ?? ไม่มากและเดาว่าใน C ++ คนที่ทำการย้ายจะเป็นคอมพิวเตอร์ของคุณอย่างไร ... คอมพิวเตอร์จะไม่สนุกกับการย้ายไลบรารีทั้งหมดสำหรับไฟล์ต้นฉบับทุกไฟล์ที่คุณเขียน :) .....