नहीं, व्यावहारिक रूप से नहीं, लेकिन अभ्यास में हाँ, लेकिन यदि आप व्यावहारिक होना चाहते हैं।
नहीं
upper_bound
ForwardIterator की आवश्यकता है। फॉरवर्डइटरेटर को *
एक वास्तविक संदर्भ देता है, और कि यदि दो पुनरावर्तक बराबर हैं तो वे एक ही ऑब्जेक्ट को संदर्भित करते हैं।
नहीं व्यावहारिक रूप से
एक कंटेनर-कम इटरेटर लिए, यह एक पागलपन की हद तक जटिल इटरेटर है कि मूल्यों यह किसी तरह का एक साझा वैश्विक मानचित्र में देता कैश की आवश्यकता है। इसे आधा व्यावहारिक बनाने के लिए, ध्यान दें कि पुनरावर्तक आवश्यकताएं संदर्भ के जीवनकाल के बारे में बहुत कम कहती हैं; इसलिए आप गिनती का संदर्भ देना चाहते हैं और मूल्यों को नष्ट करना चाहते हैं क्योंकि प्रश्न में इटरेटर मौजूद हैं।
इस तरह के एक समाधान तुल्यकालन, वैश्विक राज्य की आवश्यकता है, और काफी अधिक महंगे और boost::integer_range
की तरह कुछ की तुलना में जटिल है। कोई साधु व्यक्ति यह नहीं दिखाएगा कि एक अभ्यास के रूप में मानक को तय करने की आवश्यकता क्यों है।
लेकिन हाँ व्यवहार में
upper_bound
का कोई समझदार कार्यान्वयन वास्तव में है कि प्रश्न में iterators पूर्ण पैमाने पर आगे iterators हैं की आवश्यकता है, एक है कि पूर्ण अवधारणा-जांच करता है मानक के खिलाफ मान्य करने के लिए करता है (और के खिलाफ नहीं को छोड़कर वास्तविक एल्गोरिदम की क्या ज़रूरत है)। मूल्यों पर स्थिरता के साथ इनपुट इटरेटर लगभग निश्चित रूप से यह करता है। सी ++ मानक में ऐसी कोई अवधारणा नहीं है, और आगे इटरेटर मानक में सबसे कमजोर इटरेटर श्रेणी है जो इसे प्रमाणित करता है।
यह समस्या, प्रभावी रूप से मांग की iterators कंटेनरों द्वारा समर्थित किया की, मेरी राय में मानक में एक दोष है। कंटेनर-फ्री इटरेटर्स शक्तिशाली और उपयोगी हैं, सिवाय इसके कि वे मानक कंटेनर में शायद ही कभी तकनीकी रूप से काम करते हैं।
नई इटरेटर श्रेणियां जोड़ कर, समस्याग्रस्त साबित कर दिया है मौजूदा कोड को तोड़ने के बिना यह करने के लिए थोड़ा रास्ता है क्योंकि वहाँ। उन्होंने इसे संगत इटरेटर्स के लिए देखा, और इसे अव्यवहारिक रूप से लिखा (मुझे उनके द्वारा किए गए कार्यों के बारे में सभी जानकारी नहीं पता)।
नए इटरेटर अवधारणाओं को जोड़ना जो टैग द्वारा समर्थित नहीं हैं, अधिक संभव है, लेकिन शायद तब तक प्रतीक्षा करनी होगी जब तक अवधारणाएं सी ++ भाषा का हिस्सा न हों और न केवल मानक; फिर नई अवधारणाओं को जोड़ने के साथ प्रयोग करना कुछ ऐसा हो जाता है जिसे आप मानक में बजाय C++ में निर्दिष्ट कर सकते हैं, जो इसे अधिक आसान बनाता है।
लेकिन कोई अगर तुम व्यावहारिक
यह करता है, तथापि, एक बीमार का गठन कार्यक्रम में परिणाम होना चाहता हूँ, कोई निदान की आवश्यकता है। तो विचार करें कि यह इसके लायक है; यह वास्तव में एक कार्यक्रम जिसका हर excution अपरिभाषित व्यवहार है बनाए रखने की तुलना में upper_bound
reimplement करना आसान हो सकता है, और हर एक संकलक उन्नयन की दया पर संकलित करें।
तो 'start' और' end' सादे पूर्णांक मूल्यों कर रहे हैं? तब नहीं, आप 'std :: upper_bound' का उपयोग नहीं कर सकते हैं। लगभग सभी एल्गोरिदमिक फ़ंक्शन इटरेटर्स में भरोसा करते हैं। हालांकि यह [उत्पन्न] एक कंटेनर के लिए (http://en.cppreference.com/w/cpp/algorithm/generate) मूल्यों के लिए आसान होना चाहिए। –
@ सोप्रप्रोग्रामड्यूड हाँ यह आसान होगा, लेकिन मैं प्रदर्शन हिट – Shmoopy
@Shmoopy से बचना चाहूंगा यदि आप एक कंटेनर भरना नहीं चाहते हैं, तो आप रेंज इटरेटर्स (जैसे कि पायथन में 'रेंज()') बना सकते हैं या ढूंढ सकते हैं मौजूदा कार्यान्वयन – Holt