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


10

जोनाथन बोकरा ( धाराप्रवाह सी ++ के लेखक ) ने पाइप नामक एक पुस्तकालय लिखा ।

यह "पाइपिंग", रिपॉजिटरी का मुख्य पृष्ठ कहता है, रेंज के उपयोग की तरह नहीं है, भले ही यह समान दिखता है: यह आलसी पुलिंग पर आधारित नहीं है, बल्कि उत्सुक धक्का है। लेकिन यह कहा गया है कि कोई व्यक्ति विभिन्न 'पाइप' ऑपरेशन करने के लिए रेंज लाइब्रेरी का उपयोग नहीं कर सकता है। उदाहरण के लिए:

  • अनज़िप - एक ज़िप्ड इनपुट लें - के-टुपल्स की एक श्रेणी अनिवार्य रूप से - और के अलग, स्वतंत्र आउटपुट उत्पन्न करता है।
  • कांटा - एक कंटेनर / रेंज की कई (स्वतंत्र) प्रतियों का उत्पादन करें।

मैं काफी समझ में नहीं आता, सिद्धांत रूप में, यही मामला है। (निश्चित रूप से उन सीमाओं के अपवाद के साथ, जहां आपको अंतिम पुनरावृत्ति / प्रहरी नहीं मिल सकता है।)

जवाबों:


7

जिस पर चर्चा की जा रही है वह अनिवार्य रूप से एक पुश-आधारित प्रसंस्करण पद्धति और एक पुल-आधारित के बीच का अंतर है। इस पाइप लाइब्रेरी की तरह एक पुश-सिस्टम में, आप प्रसंस्करण की एक श्रृंखला स्थापित करते हैं, और प्रत्येक प्रसंस्करण चरण सीधे अपने डेटा को अगले में धकेलता है। श्रेणियों की तरह एक पुल-सिस्टम में, आप डेटा का एक प्रतिनिधित्व स्थापित करते हैं, जिसे आप आवश्यकतानुसार एक्सेस और संशोधित कर सकते हैं। प्रसंस्करण अपने आप नहीं होता है; यह तभी होता है जब कोई व्यक्ति सीमा का उपभोग करने का प्रयास करता है।

unzipऔर forkसंचालन दोनों एक-से-कई आपरेशनों हैं: वे एक ही इनपुट लेने के लिए और कई प्रोसेसिंग आपरेशन से मैप करें।

एक धक्का प्रणाली के रूप में, पाइप लाइब्रेरी अपने एपीआई की संरचना के कारण एक-से-कई संचालन को संभाल सकती है। एक ऑपरेशन एक फ़ंक्शन कॉल द्वारा दर्शाया गया है; इनपुट का उपयोग करने के बिंदु से निहित है ( >>=किसी प्रोसेसर का उपयोग या इसे पारित करना)। फ़ंक्शन के पैरामीटर इसके आउटपुट को परिभाषित करते हैं (स्वयं प्रोसेसर के लिए निर्धारित मापदंडों की अनदेखी)। और चूंकि C ++ फ़ंक्शंस में मापदंडों की मनमानी संख्या हो सकती है, एक-से-कई मैपिंग ऑपरेशन स्वाभाविक रूप से बाहर हो जाते हैं। आप बस विभिन्न आउटपुट के लिए उचित प्रोसेसर की आपूर्ति करते हैं।

पुल प्रणाली के रूप में, रेंज रिटर्न वैल्यू पर आधारित होती है। C ++ में कई मानों को वापस करने के लिए कोई भाषा तंत्र नहीं है, इसलिए हम जो सबसे अच्छा कर सकते हैं वह है "मान" जो कई मूल्यों का प्रतिनिधित्व करता है।

हालाँकि, रेंज अडैप्टर चेनिंग अंतत: इनपुट्स रेंज पर आधारित है । और एक "'मूल्य' जो कई मूल्यों का प्रतिनिधित्व करता है" स्वयं एक सीमा नहीं है। इसमें श्रेणियां शामिल हो सकती हैं, लेकिन यह इसे सीमा नहीं बनाती है।

तो अब आपको यह निश्चित रूप से "एक सीमा नहीं" प्रकार लेना होगा और अपने सभी रेंज एडेप्टर को इसके साथ काम करना होगा। एक रेंज अडैप्टर लगाने से उस ऑपरेशन को पूरे टाइप में प्रसारित करना होगा, जिससे कई-कई ऑपरेशन हो सकते हैं। ऐसा करना आसान नहीं है।

लेकिन इससे भी महत्वपूर्ण बात ... यह वह नहीं है जो आप चाहते हैं । यदि आप forkएक सीमा रखते हैं, तो आप लगभग निश्चित रूप से प्रतिकृति श्रेणियों पर अलग-अलग प्रसंस्करण करना चाहते हैं। और ऐसा करने के लिए |ऑपरेशन का उपयोग करने के किसी भी अवसर को पूरी तरह से बंद कर देता है। आपको इन रेंज-ट्यूपल्स के विशिष्ट भागों में एडेप्टर लगाने के तरीके बनाने होंगे। और वे तरीके तेजी से एक पुश-आधारित प्रोसेसर की तरह दिखने वाले हैं।

दिन के अंत में, पुल-स्टाइल सिस्टम में प्रत्येक स्तर पर केवल एक आउटपुट होता है। यह इस तरह के एपीआई की मुख्य अवधारणा का हिस्सा है: प्रत्येक प्रसंस्करण कदम एक सीमा उत्पन्न करता है । इसके फायदे (आलसी प्रसंस्करण) हैं, लेकिन एक-से-कई संचालन का प्रतिनिधित्व करना इसके कमजोर क्षेत्रों में से एक है।

रंग निश्चित रूप से एक unzipफ़ंक्शन हो सकता है ( forkयह वास्तव में सिर्फ सीमा की नकल है)। लेकिन यह |स्टाइल एडॉप्टर नहीं होगा ; यह एक ऐसा फंक्शन होगा जो कुछ डीकंपोज़ल टाइप पर रेंज लेता है और रेंज का एक टपल देता है। यदि आप उनके साथ अधिक प्रसंस्करण करना चाहते हैं, तो आपको टपल को एक मूल्य में संग्रहीत करने की आवश्यकता है, व्यक्तिगत तत्वों तक पहुंचें, और जैसा कि आप फिट देखते हैं, उनका उपयोग करें।

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