Ios_base का महत्व :: Sync_with_stdio (झूठा); cin.tie (शून्य);


146

सहित का क्या महत्व है

ios_base::sync_with_stdio(false);
cin.tie(NULL);

सी ++ कार्यक्रमों में?

मेरे परीक्षणों में, यह निष्पादन के समय को गति देता है, लेकिन क्या एक परीक्षण मामला है जिसे मुझे इसमें शामिल करने के बारे में चिंतित होना चाहिए?

क्या 2 कथनों को हमेशा एक साथ रहना पड़ता है, या पहले एक पर्याप्त है, अर्थात अनदेखी cin.tie(NULL)?

साथ ही, क्या यह एक साथ C और C ++ कमांड का उपयोग करने की अनुमति है यदि इसका मूल्य निर्धारित किया गया है false?

https://www.codechef.com/viewsolution/7316085

उपरोक्त कोड ने ठीक काम किया, जब तक कि मैं scanf/printfC ++ प्रोग्राम में मूल्य के साथ उपयोग नहीं किया true। इस मामले में, इसने एक विभाजन दोष दिया। इसके लिए संभावित स्पष्टीकरण क्या हो सकता है?


आपने वास्तव में इसका प्रयोग किया है। आपका कोड ऐसा कहता है ???
सूरज जैन

जवाबों:


231

दो कॉल के अलग-अलग अर्थ हैं जिनका प्रदर्शन से कोई लेना-देना नहीं है; तथ्य यह है कि यह निष्पादन समय को गति देता है (या हो सकता है ) सिर्फ एक साइड इफेक्ट है। आपको समझना चाहिए कि उनमें से प्रत्येक क्या करता है और आँख बंद करके उन्हें हर कार्यक्रम में शामिल नहीं करता है क्योंकि वे एक अनुकूलन की तरह दिखते हैं।

ios_base::sync_with_stdio(false);

यह C और C ++ मानक धाराओं के बीच सिंक्रनाइज़ेशन को अक्षम करता है। डिफ़ॉल्ट रूप से, सभी मानक धाराएँ सिंक्रनाइज़ की जाती हैं, जो व्यवहार में आपको C- और C ++ - शैली I / O को मिलाने और समझदार और अपेक्षित परिणाम प्राप्त करने की अनुमति देती हैं। यदि आप सिंक्रनाइज़ेशन को अक्षम करते हैं, तो C ++ स्ट्रीम को अपने स्वयं के स्वतंत्र बफ़र्स रखने की अनुमति है, जो C- और C ++ - शैली I / O को एक साहसिक मिश्रण बनाता है।

यह भी ध्यान रखें कि सिंक्रनाइज़ सी ++ स्ट्रीम थ्रेड-सुरक्षित हैं (विभिन्न थ्रेड से आउटपुट इंटरलेव हो सकता है, लेकिन आपको कोई डेटा दौड़ नहीं मिलती है)।

cin.tie(NULL);

इससे अनहोनी cinहोती है cout। बंधी हुई धाराएं यह सुनिश्चित करती हैं कि एक स्ट्रीम दूसरे स्ट्रीम पर प्रत्येक I / O ऑपरेशन से पहले अपने आप फ्लश हो जाए।

डिफ़ॉल्ट रूप cinसे coutएक समझदार उपयोगकर्ता बातचीत सुनिश्चित करने के लिए बंधा हुआ है । उदाहरण के लिए:

std::cout << "Enter name:";
std::cin >> name;

यदि cinऔर coutबंधा हुआ है, तो आप प्रोग्राम को उपयोगकर्ता से इनपुट के संकेत देने से पहले आउटपुट को फ्लश कर सकते हैं (यानी, कंसोल पर दिखाई दे रहे हैं)। यदि आप धाराएँ खोलते हैं, तो प्रोग्राम उपयोगकर्ता के नाम के लिए प्रतीक्षा करने को अवरुद्ध कर सकता है, लेकिन "नाम दर्ज करें" संदेश अभी तक दिखाई नहीं दे रहा है (क्योंकि coutडिफ़ॉल्ट रूप से बफ़र किया गया है, आउटपुट फ्लश किया जाता है / केवल मांग पर या कंसोल पर प्रदर्शित किया जाता है। बफर भर गया है)।

इसलिए यदि आप से अनटाइट करते cinहैं cout, तो आपको coutइनपुट पर अपेक्षा करने से पहले हर बार मैन्युअल रूप से फ्लश करना सुनिश्चित करना चाहिए cin

निष्कर्ष में, जानें कि उनमें से प्रत्येक क्या करता है, परिणामों को समझें, और फिर तय करें कि क्या आप वास्तव में चाहते हैं या गति सुधार के संभावित दुष्प्रभाव की आवश्यकता है ।


जब आप कहते हैं, "आपको हर बार जब आप कुछ समय तक सिनेमा पर इनपुट की उम्मीद करना चाहते हैं, तो आप मैन्युअल रूप से कॉट को फ्लश करना सुनिश्चित करेंगे", यह उतना ही सरल हो सकता है जितना कि "... << std :: flush" या "... < <std :: endl "हर पंक्ति के अंत में जो" std :: cout << ... "शुरू होता है, सही है?
एलन

4
हां, यह उतना ही सरल है, लेकिन "हर पंक्ति का अंत" भाग के साथ सावधान रहें। coutएक कारण के लिए बफ़र किया जाता है, यदि आप इसे अक्सर फ्लश करते हैं, जब आपको वास्तव में इसकी आवश्यकता नहीं होती है, तो आप एक प्रदर्शन हिट देख सकते हैं।
Ionut

@ आईऑन स्कैन, प्रिंटफ के लिए सी में टाई () कार्यक्षमता के बराबर कुछ है?
iajnr

1
@ जिन्नर नहीं, सीधे नहीं। सी में, आप या तो पहले मैन्युअल रूप से फ्लश कर सकते हैं scanf(), बफरिंग को पूरी तरह से अक्षम कर सकते हैं या लाइन बफरिंग पर स्विच कर सकते हैं (जिसे न्यूलाइन के बाद फ्लश करना चाहिए या जब इनपुट से पढ़ा जाता है stdin- linux.die.net/man/3/setlinebuf देखें )।
Ionut

1
लेटकोड पर, यह रनटाइम में काफी सुधार करता है, हो सकता है कि ये प्रतियोगी वेबसाइट इनपुट परीक्षणों के लिए कुछ खास करें।
P0W

18

यह C और C ++ दुनिया से IOs को सिंक्रोनाइज़ करना है। यदि आप सिंक्रनाइज़ करते हैं, तो आपके पास गारंटी है कि सभी IOs के आदेश ठीक वही हैं जो आप अपेक्षा करते हैं। सामान्य तौर पर, समस्या IOs की बफरिंग है जो समस्या का कारण बनती है, दोनों दुनियाओं को एक ही बफ़र्स को साझा करने के लिए सिंक्रनाइज़ करते हैं। उदाहरण के लिए cout << "Hello"; printf("World"); cout << "Ciao";; तुल्यकालन के बिना आप कभी पता नहीं चलेगा अगर तुम मिल जाएगा HelloCiaoWorldया HelloWorldCiaoया WorldHelloCiao...

tieआपको गारंटी देता है कि C ++ दुनिया में IOs चैनल एक-दूसरे से बंधे हैं , जिसका अर्थ है कि इनपुट आने से पहले हर आउटपुट फ्लश हो गया है (विचार करें cout << "What's your name ?"; cin >> name;)।

आप हमेशा C या C ++ IOs का मिश्रण कर सकते हैं, लेकिन यदि आप कुछ उचित व्यवहार चाहते हैं, तो आपको दोनों दुनियाओं को सिंक्रनाइज़ करना होगा। खबरदार कि सामान्य तौर पर उन्हें मिश्रण करने की अनुशंसा नहीं की जाती है, यदि आप C में प्रोग्राम का उपयोग C stdio में करते हैं, और यदि आप C ++ में प्रोग्राम स्ट्रीम का उपयोग करते हैं। लेकिन आप मौजूदा C पुस्तकालयों को C ++ कोड में मिलाना चाह सकते हैं, और ऐसे में दोनों को सिंक्रोनाइज़ करने की जरूरत है।


4
सिंक्रोनाइजेशन के बिना भी, अलग-अलग कॉल cout <<ऑर्डर नहीं बदल सकते हैं इसलिए CiaoHelloWorldयह आपके उदाहरण के मामले में संभव नहीं है। विभिन्न बफ़रिंग विधियों के बारे में सिंक्रोनाइजेशन सख्त है।
मिकको रैंटलैनेन

3

का उपयोग करना ios_base::sync_with_stdio(false);पर्याप्त है Cऔर C++धाराएं। आप लैंगर और क्रेफ्ट द्वारा स्टैंडर्ड सी ++ आईओएसट्रीम और लोकल में इसकी चर्चा पा सकते हैं । वे ध्यान दें कि यह कार्य कार्यान्वयन-परिभाषित कैसे है।

cin.tie(NULL)कॉल एक पर गतिविधियों के बीच decoupling का अनुरोध किया जा रहा है cinऔर cout। मैं समझा नहीं सकता कि दूसरे अनुकूलन के साथ इसका उपयोग करने से दुर्घटना क्यों हो सकती है। जैसा कि कहा गया है, आपके द्वारा दी गई लिंक खराब है, इसलिए यहां कोई अटकल नहीं है।


0

सिनेमा इनपुट का काम तेजी से करना आम बात है ।

एक त्वरित स्पष्टीकरण के लिए: पहली पंक्ति बफ़र सिंक्रोनाइज़ेशन को बजाती है सिनेम स्ट्रीम और सी-स्टाइल stdio टूल्स (जैसे कि स्कैनफ या मिलता है) के बीच - इसलिए cin तेजी से काम करता है, लेकिन आप इसे एक साथ stdio टूल के साथ उपयोग नहीं कर सकते ।

दूसरी पंक्ति Unties CIN से अदालत - डिफ़ॉल्ट रूप से अदालत बफर हर बार जब आप से कुछ पढ़ा flushes CIN । और यह धीमा हो सकता है जब आप बार-बार कुछ छोटा पढ़ते हैं तो कई बार कुछ छोटा लिखते हैं। इससे समन्वयन बंद लाइन बदल जाता है (शाब्दिक बांधकर तो CIN को अशक्त करने के बजाय अदालत )।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.