2013-12-16 5 views
5

के बिना एसटीएल एल्गोरिदम लिखना संभव है मेरा प्रश्न आंशिक रूप से this question द्वारा प्रेरित है।क्या इंटरमीडिएट कंटेनर

क्या इंटरमीडिएट कंटेनर के बिना एसटीएल एल्गोरिदम, या उपयोगकर्ता एल्गोरिदम लिखने का कोई तरीका है? एक उत्तर बूस्ट से उपकरण का उपयोग कर सकता है, लेकिन मान लीजिए कि मिश्रित एल्गोरिदम उपयोगकर्ता बनाए गए हैं, या एसटीएल से।

तो boost::adaptors::reversed उलटा नहीं है क्योंकि रिवर्सिंग एल्गोरिदम बढ़ावा में है।

+0

एसटीएल से बनाए गए या एल्गोरिदम उपयोगकर्ता के बारे में क्या धारणा दी गई उत्तर को रोकती है? – polkadotcadaver

+0

@PaulDraper यह नहीं कहा कि जब मैंने टिप्पणी लिखी थी :) – polkadotcadaver

+0

"मेरा प्रश्न आंशिक रूप से इस प्रश्न से प्रेरित है।" - यह * आंशिक रूप से प्रेरित * कैसे है और डुप्लिकेट नहीं है? –

उत्तर

7

सं

मान लीजिए कि f और g एसटीएल एल्गोरिदम हैं करते हैं।

मान लें कि आप क्या चाहते हैं f(g(x)) (मैं यहां विचार व्यक्त करने की कोशिश कर रहा हूं ...)।

g(x) के परिणामस्वरूप एक कंटेनर होने के बाद मध्यवर्ती कंटेनर होने का कोई तरीका नहीं है।

यदि आप मध्यवर्ती कंटेनर से बचने जा रहे हैं, तो आपको एल्गोरिदम का उपयोग करना चाहिए जो Boost.Range adaptors (उदा। boost::adaptors::reversed) जैसे अन्य एल्गोरिदम के साथ "निरीक्षण" या बातचीत कर सकता है।

उदाहरण के लिए, f कहें "सॉर्ट" और g "रिवर्स" है। बूस्ट के एडाप्टर यह पता लगा सकते हैं कि रिवर्स चरण एक नो-ऑप है और इसे छोड़ दें। एसटीएल एल्गोरिदम ऐसा नहीं कर सका, क्योंकि उस जानकारी के माध्यम से इसे बनाने के लिए कोई रास्ता नहीं है।

+0

तो कोई "एडाप्टर एडाप्टर" नहीं है, जो 'std :: reversed' को' boost :: adapters :: reversed 'में बदल सकता है? मैं अपने पास होने वाले प्रत्येक स्वतंत्र एल्गोरिदम के लिए एक रैपर को फिर से लिखना नहीं चाहता हूं। – Polymer

+0

@ पॉलिमर, मुझे एक रैपर को फिर से लिखने के बारे में निश्चित नहीं है; मुझे लगता है कि आप 'बूस्ट :: एडेप्टर' संगत एल्गोरिदम लिखेंगे। लेकिन जवाब हां है, आप "गुप्त" (?) 'Std :: reversed' को बढ़ावा नहीं दे सकते हैं :: एडाप्टर :: उलट ' –

+0

कनवर्ट एक बेहतर शब्द है, धन्यवाद। – Polymer

1

हाँ इनपुट और आउटपुट इटरेटर के साथ संगत एल्गोरिदम के लिए हाँ।

इसे निष्पादन स्थिति, या कुछ कोरआउट जैसे स्टोर को थ्रेड की आवश्यकता होती है।

प्रत्येक चरण आउटपुट इटरेटर को लिखता है जो निष्पादन को रोकता है और अगले एल्गोरिदम चलाता है। इसी तरह अगले इनपुट मान से पढ़ना निष्पादन के धागे को रोकता है और इसे तैयार होने पर प्रतीक्षा करता है।

कई <algorithms> उपर्युक्त प्रतिबंधों को फिट नहीं करते हैं। लेकिन जो लोग अपनी आवश्यकताओं को दस्तावेज करना चाहिए। transform योग्यता प्राप्त करता है, मैं अपने सिर के शीर्ष से दूसरों के बारे में नहीं सोच सकता।

+0

यह वास्तव में एक दिलचस्प जवाब है। मुझे समझने दो कि क्या मैं समझता हूं। आपके पास स्थगित निष्पादन पुनरावर्तक है, हम 'defIter' को कॉल करेंगे। इसका कन्स्ट्रक्टर एल्गोरिदम स्वीकार करता है (इनपुट इंटरफेस को स्वीकार करने वाले इंटरफ़ेस के साथ)। हम '[inA, inB)' लेते हुए एक एल्गोरिदम लिख रहे हैं और '[आउटए, आउटबी)' पर आउटपुट कर रहे हैं, जहां 'इनए, इनबी' इनपुट इटरेटर्स हैं और 'आउटए, आउटबी' आउटपुट इटरेटर हैं। "रचित" कोड कुछ 'first_algorithm (inA, inB, defIter {second_algorithm, outA, outB}) जैसा दिखता है। 'second_algorithm' इनपुट इटरेटर्स से पढ़ेगा जो निष्पादन को 'first_algorithm' पर वापस कर देगा। – Polymer

+0

@ पॉलिमर हाँ, जो मूल रूप से सही लगता है। यदि आपके पास कुछ प्रकार का सी ++ कोरआउट एक्सटेंशन था, तो आप इसे एक थ्रेड में भी कर सकते थे, क्योंकि बफरिंग की कमी का मतलब है कि हम किसी भी तरह से थ्रेडेड हैं: थ्रेडिंग बस हमें एक स्थान पर 'second_algorithm' की प्रसंस्करण को रोकने के लिए मौजूद है जहां यह वास्तव में रोकना नहीं चाहता है (जब इसके इनपुट से पढ़ते हैं)। ध्यान दें कि 'defIter' एक आउटपुट इटरेटर को आउटपुट करेगा, न कि 2. – Yakk

+0

आपका अधिकार, यह केवल एक पुनरावर्तक को आउटपुट करेगा! इस इटरेटर को लागू करने से पहले, क्या बूस्ट, या कुछ अन्य लाइब्रेरी में कुछ भी है, जो इस तरह कुछ प्रदान करता है? – Polymer

संबंधित मुद्दे