एक सेंटीनेल शुरू करने के लिए केंद्रीय प्रेरणा यह है कि बहुत सारे इटरेटर ऑपरेशंस हैं जो समर्थित हैं लेकिन आमतौर पर एंड-इटरेटर end()
के लिए कभी भी आवश्यकता नहीं होती है। उदाहरण के लिए, के माध्यम से इसे बढ़ाने में *end()
के माध्यम से इसे संदर्भित करने में शायद ही कोई बिंदु नहीं है, और इसलिए (*) पर।
इसके विपरीत, end()
का मुख्य उपयोग केवल क्रम में एक इटरेटर it
के साथ तुलना करना signalize के लिए कि क्या it
बात यह सिर्फ दोहराता के अंत में है। और, सामान्य रूप से प्रोग्रामिंग में, विभिन्न आवश्यकताओं और विभिन्न अनुप्रयोगों का सुझाव एक नया प्रकार है।
रेंज-v3 पुस्तकालय (है कि एक अवधारणा के माध्यम से कार्यान्वित किया जाता है) एक धारणा में इस अवलोकन बदल जाता है: यह end()
के लिए एक नए प्रकार का परिचय और केवल आवश्यकता है कि यह समानता-तुलनीय इसी इटरेटर के साथ है - लेकिन आवश्यकता नहीं है सामान्य इटरेटर ऑपरेशंस)। इस नए प्रकार के end()
को सेंटीनेल कहा जाता है।
यहां मुख्य लाभ प्राप्त अवशोषण और चिंताओं का बेहतर अलगाव है, जिसके आधार पर संकलक संभवतः बेहतर अनुकूलन करने में सक्षम है।
struct my_iterator; //some iterator
struct my_sentinel
{
bool is_at_end(my_iterator it) const
{
//here implement the logic when the iterator is at the end
}
};
auto operator==(my_iterator it, my_sentinel s) //also for (my_sentinel s, my_iterator it)
{
return s.is_at_end(it);
}
अमूर्त देखें: कोड में, मूल विचार यह (यह सिर्फ स्पष्टीकरण के लिए है और सीमा-v3 पुस्तकालय के साथ कोई संबंध नहीं है) है? अब, आप किसी भी जैसे जाँच आप is_at_end
समारोह में चाहते हैं, को लागू कर सकते हैं: कभी नहीं
- रोक
N
वेतन वृद्धि के बाद (एक अनंत श्रेणी प्राप्त)
- स्टॉप (एक गिना रेंज पाने के लिए)
- रोक जब एक
\0
का सामना करना पड़ रहा है, यानी *it = '\0'
(सी-स्ट्रिंग्स पर लूपिंग के लिए)
- 12'o घड़ी (दोपहर के भोजन के लिए) बंद होने पर रोकें, और इसी तरह।
इसके अलावा, प्रदर्शन के बारे में, एक चेक में संकलन समय-जानकारी के उपयोग करने के लिए सक्षम है (जैसे, N
का एक संकलन समय पैरामीटर के रूप में इसके बाद के संस्करण लगता है)। इस मामले में, संकलक शायद कोड को बेहतर अनुकूलित करने में सक्षम हो सकता है।
(*) ध्यान दें कि इसका मतलब यह नहीं है कि सामान्य रूप से इस तरह के संचालन के लिए कोई उपयोग नहीं है।उदाहरण के लिए, --end()
कुछ स्थानों पर उपयोगी हो सकता है, उदाहरण के लिए देखें this question। हालांकि, इनके बिना मानक लाइब्रेरी को लागू करना संभवतः संभव है - यह रेंज-वी 3 लाइब्रेरी ने किया है।
एक ज़िप रेंज क्या है? – Walter
@walter ने फुटनोट – Yakk
हम्म जोड़ा। लेकिन एक ज़िप इटरेटर एक रैंडमएक्सइटरेटर नहीं हो सकता है, क्योंकि इसके 'संदर्भ'' value_type 'के समान नहीं हैं। इसलिए कुछ मानक एल्गोरिदम काम नहीं कर सकता (जैसा आपने कहा है [स्वयं] (http://stackoverflow.com/a/32871002/1023390))। तो यह अच्छा क्या है? – Walter