मुझे क्यों नहीं # निकलना चाहिए <बिट्स / stdc ++। H>?
मैंने अपने कोड के साथ एक प्रश्न पोस्ट किया जिसका एकमात्र #include
निर्देश निम्नलिखित था:
#include <bits/stdc++.h>
मेरे शिक्षक ने मुझे ऐसा करने के लिए कहा, लेकिन टिप्पणी अनुभाग में मुझे बताया गया कि मुझे नहीं करना चाहिए।
क्यों?
जवाब
सहित <bits/stdc++.h>
, स्टैक ओवरफ्लो पर देखने के लिए एक तेजी से सामान्य बात प्रतीत होती है, शायद वर्तमान शैक्षणिक वर्ष में राष्ट्रीय पाठ्यक्रम में कुछ नया जोड़ा गया है।
मुझे लगता है कि फायदे इस प्रकार दिए गए हैं:
- आपको केवल एक
#include
पंक्ति लिखने की आवश्यकता है - आपको यह देखने की आवश्यकता नहीं है कि सब कुछ किस मानक हेडर में है
दुर्भाग्य से, यह एक आलसी हैक एक जीसीसी आंतरिक हेडर के बजाय सीधे की तरह अलग-अलग मानक हेडर नामकरण है, <string>
, <iostream>
और <vector>
। यह पोर्टेबिलिटी को बर्बाद करता है और भयानक आदतों को बढ़ावा देता है।
नुकसान में शामिल हैं:
- यह शायद केवल उस कंपाइलर पर काम करेगा
- आपके पास इसका उपयोग करने पर यह पता नहीं होगा कि यह क्या करेगा, क्योंकि इसकी सामग्री एक मानक द्वारा निर्धारित नहीं है
- यहां तक कि बस अपने कंपाइलर को अपने अगले संस्करण में अपग्रेड करने से आपका प्रोग्राम टूट सकता है
- हर एक मानक हेडर को आपके स्रोत कोड के साथ पार्स और संकलित किया जाना चाहिए, जो धीमा है और निश्चित संकलन सेटिंग्स के तहत एक भारी निष्पादन योग्य है।
यह मत करो!
अधिक जानकारी:
- दृश्य स्टूडियो के साथ #include <बिट्स / stdc ++। h> संकलित नहीं करता है
- C ++ में #include <बिट्स / stdc ++। H> कैसे काम करता है?
Quora क्यों खराब है इसका उदाहरण:
क्यों? क्योंकि इसका उपयोग ऐसे किया जाता है जैसे कि यह C ++ मानक हेडर माना जाता है, लेकिन कोई भी मानक इसका उल्लेख नहीं करता है। तो आपका कोड निर्माण से गैर-पोर्टेबल है। आप इसे cppreference पर इसके लिए कोई दस्तावेज़ नहीं पाएंगे । तो यह मौजूद नहीं हो सकता है। यह किसी की कल्पना का एक अनुमान है :)
मैंने अपने हॉरर और अविश्वास की खोज की है - कि एक प्रसिद्ध ट्यूटोरियल साइट है जहां हर C ++ उदाहरण में इस हेडर को शामिल करना प्रतीत होता है । दुनिया पागल है। यही प्रमाण है।
किसी को भी इस तरह के "ट्यूटोरियल" लिखने के लिए
कृपया इस शीर्ष लेख का उपयोग करना बंद करें। इसके बारे में भूल जाओ। इस पागलपन का प्रचार न करें। यदि आप यह समझने के लिए तैयार नहीं हैं कि ऐसा करना गलत क्यों है , तो इसके लिए मेरा शब्द लें। मैं किसी भी चीज पर अधिकार के एक आंकड़े के रूप में ठीक नहीं माना जा रहा हूं, और मैं शायद आधे समय से भरा हुआ हूं, लेकिन मैं केवल इस एक मामले में अपवाद बनाऊंगा। मैं दावा करता हूं कि मुझे पता है कि मैं यहां किस बारे में बात कर रहा हूं। मुझे मेरे शब्द पर ले लो। मैं तुम्हें फंसाता हूं।
पीएस मैं अच्छी तरह से घृणित "शिक्षण मानक" की कल्पना कर सकता हूं जहां यह दुष्ट विचार हो सकता है, और जिन परिस्थितियों के कारण यह हुआ। सिर्फ इसलिए कि इसके लिए एक व्यावहारिक आवश्यकता प्रतीत हो रही थी, यह स्वीकार्य नहीं है - रेट्रोस्पेक्ट में भी नहीं।
पीपीएस नहीं, इसके लिए कोई व्यावहारिक आवश्यकता नहीं थी। कई सी ++ मानक हेडर नहीं हैं, और वे अच्छी तरह से प्रलेखित हैं। यदि आप सिखाते हैं, तो आप अपने छात्रों को इस तरह के "जादू" को जोड़कर एक असंतोष कर रहे हैं। एक जादुई मानसिकता के साथ प्रोग्रामर का निर्माण करना हम चाहते हैं। यदि आपको छात्रों को अपने जीवन को आसान बनाने के लिए C ++ का सबसेट की पेशकश करने की आवश्यकता है, तो केवल आपके द्वारा पढ़ाए जाने वाले पाठ्यक्रम पर लागू हेडर की छोटी सूची के साथ एक हैंडआउट का उत्पादन करें, और लाइब्रेरी के लिए संक्षिप्त प्रलेखन के साथ आप उन छात्रों के उपयोग की अपेक्षा करते हैं।
एक स्टैक एक्सचेंज साइट है जिसे प्रोग्रामिंग पजल्स एंड कोड गोल्फ कहा जाता है । प्रोग्रामिंग पहेली उस साइट पर की इस परिभाषा फिट पहेली :
एक खिलौना, समस्या, या अन्य अंतर्ज्ञान को सरलता या रोगी के प्रयास से हल करने के लिए कठिनाइयों को पेश करने के लिए डिज़ाइन किया गया।
वे मनोरंजन करने के लिए डिज़ाइन किए गए हैं, और इस तरह से नहीं कि एक कामकाजी प्रोग्रामर को अपने दैनिक काम में आने वाली वास्तविक दुनिया की समस्या से चकित किया जा सकता है।
कोड गोल्फ "एक प्रकार की मनोरंजक कंप्यूटर प्रोग्रामिंग प्रतियोगिता है जिसमें प्रतिभागी सबसे कम संभव स्रोत कोड को प्राप्त करने का प्रयास करते हैं जो एक निश्चित एल्गोरिथ्म को लागू करता है।" PP & CG साइट के उत्तरों में, आप देखेंगे कि लोग अपने उत्तरों में बाइट्स की संख्या निर्दिष्ट करते हैं। जब उन्हें कुछ बाइट्स से दाढ़ी बनाने का एक तरीका मिल जाता है, तो वे मूल संख्या पर हमला करेंगे और नया रिकॉर्ड करेंगे।
जैसा कि आप उम्मीद कर सकते हैं, कोड गोल्फिंग चरम प्रोग्रामिंग भाषा का दुरुपयोग करता है। एक अक्षर का चर नाम। कोई व्हाट्सएप नहीं। पुस्तकालय कार्यों का रचनात्मक उपयोग। अप्राकृतिक सुविधाएँ। नॉनस्टैंडर्ड प्रोग्रामिंग प्रैक्टिस। हैकिंग को याद करते हुए।
यदि किसी प्रोग्रामर ने गोल्फ-स्टाइल कोड वाले काम पर एक पुल अनुरोध प्रस्तुत किया, तो इसे अस्वीकार कर दिया जाएगा। उनके सहकर्मी उन पर हंसते थे। उनका मैनेजर एक चैट के लिए उनके डेस्क से गिर जाता है। फिर भी, प्रोग्रामर पीपी एंड सीजी को जवाब प्रस्तुत करके खुद को खुश करते हैं।
इससे क्या लेना-देना है stdc++.h
? जैसा कि दूसरों ने बताया है, इसका उपयोग करना आलसी है। यह गैर-पोर्टेबल है, इसलिए आपको नहीं पता कि यह आपके कंपाइलर या आपके कंपाइलर के अगले संस्करण पर काम करेगा या नहीं। यह बुरी आदतों को बढ़ावा देता है। यह गैर-मानक है, इसलिए आपके कार्यक्रम का व्यवहार आपकी अपेक्षा से भिन्न हो सकता है। यह संकलन समय और निष्पादन योग्य आकार बढ़ा सकता है।
ये सभी वैध और सही आपत्तियां हैं। तो कोई भी इस राक्षसी का उपयोग क्यों करेगा?
यह पता चला है कि कुछ लोगों को कोड गोल्फ के बिना प्रोग्रामिंग पहेलियाँ पसंद हैं । वे एक साथ मिलते हैं और ACM-ICPC, Google कोड Jam और Facebook Hacker Cup जैसी घटनाओं पर या Topcoder और Codeforces जैसी साइटों पर प्रतिस्पर्धा करते हैं। उनकी रैंक कार्यक्रम की शुद्धता, निष्पादन की गति और वे कितनी तेजी से समाधान प्रस्तुत करते हैं, पर आधारित है। निष्पादन की गति को अधिकतम करने के लिए, कई प्रतिभागी C ++ का उपयोग करते हैं। कोडिंग गति को अधिकतम करने के लिए, उनमें से कुछ का उपयोग करें ।stdc++.h
क्या यह एक अच्छा विचार है? चलो नुकसान की सूची की जाँच करें। पोर्टेबिलिटी? इससे कोई फर्क नहीं पड़ता क्योंकि ये कोडिंग इवेंट एक विशिष्ट संकलक संस्करण का उपयोग करते हैं जो प्रतियोगियों को पहले से पता है। मानकों का अनुपालन? कोड के ब्लॉक के लिए प्रासंगिक नहीं जिसका उपयोगी जीवन एक घंटे से कम है। संकलन समय और निष्पादन योग्य आकार? ये प्रतियोगिता के स्कोरिंग रूब्रिक का हिस्सा नहीं हैं।
इसलिए हम बुरी आदतों से बचे हैं। यह एक वैध आपत्ति है। इस हेडर फ़ाइल का उपयोग करके, प्रतियोगी यह जानने का मौका लेने से बच रहे हैं कि कौन सी मानक हेडर फ़ाइल उनके प्रोग्राम में उपयोग की जाने वाली कार्यक्षमता को परिभाषित करती है। जब वे वास्तविक दुनिया कोड लिख रहे हैं (और उपयोग नहीं कर रहे हैं stdc++.h
) तो उन्हें इस जानकारी को देखने में समय बिताना होगा, जिसका मतलब है कि वे कम उत्पादक होंगे। इसके साथ अभ्यास करने का नकारात्मक पक्ष है stdc++.h
।
यह सवाल उठाता है कि यह प्रतिस्पर्धी प्रोग्रामिंग में भाग लेने के लायक क्यों है अगर यह stdc++.h
अन्य कोडिंग मानकों का उपयोग करने और उल्लंघन करने जैसी बुरी आदतों को प्रोत्साहित करता है । एक उत्तर यह है कि लोग इसे उसी कारण से करते हैं, जब वे पीपी एंड सीजी पर कार्यक्रम पोस्ट करते हैं: कुछ प्रोग्रामर अपने कोडिंग कौशल का उपयोग गेम-जैसे संदर्भ में करना सुखद समझते हैं।
तो सवाल है कि क्या उपयोग करने के लिए stdc++.h
नीचे आता है कि क्या एक प्रोग्रामिंग प्रतियोगिता में कोडिंग गति का लाभ बुरी आदतों को पछाड़ता है जो कि इसके उपयोग से विकसित हो सकते हैं।
यह सवाल पूछता है: "मुझे क्यों नहीं # शामिल होना चाहिए <bits/stdc++.h>
?" मुझे एहसास है कि यह पूछा गया था और एक बिंदु बनाने के लिए उत्तर दिया गया था, और स्वीकृत उत्तर का उद्देश्य इस प्रश्न का वन ट्रू उत्तर होना है। लेकिन सवाल यह नहीं है कि "मुझे <bits/stdc++.h>
उत्पादन कोड में क्यों शामिल नहीं होना चाहिए ?" इसलिए, मुझे लगता है कि अन्य परिदृश्यों पर विचार करना उचित है जहां उत्तर अलग हो सकता है।
N4606 से, वर्किंग ड्राफ्ट, प्रोग्रामिंग लैंग्वेज C ++ के लिए मानक:
17.6.1.2 हेडर्स [हेडर]
C ++ मानक लाइब्रेरी का प्रत्येक तत्व हेडर में घोषित या परिभाषित (उपयुक्त के रूप में) है।
सी ++ मानक पुस्तकालय 61 सी ++ लाइब्रेरी हेडर प्रदान करता है, जैसा कि तालिका 14 में दिखाया गया है।
तालिका 14 - सी ++ लाइब्रेरी हेडर
<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>
वहां कोई <बिट्स / stdc ++। H> नहीं है। यह आश्चर्य की बात नहीं है, क्योंकि <बिट्स / ...> हेडर कार्यान्वयन विवरण हैं, और आमतौर पर एक चेतावनी देते हैं:
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly.
<बिट्स / stdc ++। h> भी एक चेतावनी देता है:
* This is an implementation file for a precompiled header.
कारण जिसका हम उपयोग नहीं करते हैं:
#include <bits/stdc++.h>
कारण है। मुझे एक सादृश्य बनाने दें: आपमें से जो लोग जावा को जानते हैं: यदि आपने अपने प्रशिक्षक से पूछा कि क्या निम्नलिखित एक अच्छा विचार है, जब तक कि वे एक बुरे प्रशिक्षक न हों तो वे कहेंगे:
import java.*.*
The #include ... बात मूल रूप से एक ही काम करती है ... इसका उपयोग न करने का एकमात्र कारण नहीं है, लेकिन इसका उपयोग न करने के प्रमुख कारणों में से एक है। एक वास्तविक जीवन सादृश्य के लिए: कल्पना कीजिए कि आपके पास एक पुस्तकालय था और आप पुस्तकालय से पुस्तकों के एक जोड़े को उधार लेना चाहते थे, क्या आप अपने घर के बगल में पूरी लाइब्रेरी को स्थानांतरित कर सकते हैं ?? यह महंगा और अप्रभावी होगा। यदि आपको केवल 5 पुस्तकों की आवश्यकता है, तो अच्छी तरह से केवल 5 को हटा दें ... पूरी लाइब्रेरी नहीं .....
#include <bits/stdc++.h>
इस कार्यक्रम के अनुरूप दिखने वाले लुक के लिए मुझे केवल एक टाइप स्टेटमेंट शामिल करने की जरूरत है और यह काम करता है, एक ही चीज पूरी लाइब्रेरी को हिलाने के साथ, यह भी देखिए कि मुझे केवल 5 किताबों के बजाय एक-एक करके पूरी लाइब्रेरी को स्थानांतरित करने की जरूरत है। लगता है कि आप के लिए है, जो वास्तव में चलती है जो व्यक्ति के लिए है ?? ऐसा नहीं है, और अनुमान लगाते हैं कि C ++ में जो व्यक्ति चल रहा है वह आपका कंप्यूटर होगा ... आपके द्वारा लिखी गई प्रत्येक स्रोत फ़ाइल के लिए संपूर्ण लाइब्रेरी को हिलाने में कंप्यूटर को मज़ा नहीं आएगा:) .....