2012-06-27 8 views
10

शायद मैं lower bound की तकनीकी परिभाषा को गलत समझ रहा हूं लेकिन मुझे उम्मीद है कि मेरे पास a = { 0, 3, 4 } सेट है और a.lower_bound(2) की गणना की गई है कि परिणाम 0 होगा। अर्थात। मैं उम्मीद std::set::lower_boundinfimumstd :: set :: lower_bound (x) (प्रभावी रूप से) सबसे बड़ी संख्या <= x की बजाय सबसे छोटी संख्या> = x के रूप में परिभाषित क्यों किया गया है?

की गणितीय अवधारणा के करीब हैं और फिर भी मानक पुस्तकालय सबसे बड़ी संख्या की तुलना में (प्रभावी रूप से >=) x कम नहीं के रूप में यह परिभाषित करता है।

इसके पीछे तर्क क्या है?

+0

यह शायद अधिक iterators की सीमाओं के आधार पर विचार करने के लिए आम है, इसलिए जब आप कहते हैं कि "मैं 2 और 5 के बीच सब कुछ चाहता हूं" इटेटरेटर रिटर्न निम्न "बाधा" है। हालांकि सवाल यह है कि आप अन्यथा ऐसा क्यों उम्मीद करेंगे? इसके पीछे/आपका/तर्क क्या है? – PlasmaHH

+0

उत्कृष्ट उत्तर के अतिरिक्त, आप 'std :: prev (iter)' '' iter! = X' का उपयोग करके केवल न्यूनतम प्राप्त कर सकते हैं। –

+0

सुधार - "... मानक लाइब्रेरी इसे ** सबसे छोटी ** संख्या से कम नहीं बताती है ..." @ कोनराड रुडॉल्फ का सुझाव अच्छा है लेकिन पहले आपको 'सेट' को खाली करने की भी आवश्यकता नहीं है।'Std :: lower_bound' मुक्त फ़ंक्शन के लिए, आप "त्रुटि" की दिशा को उलट करने के लिए' रिवर्स_इटरेटर और 'std :: big' का भी उपयोग कर सकते हैं। – Potatoswatter

उत्तर

27

"[lower|upper]_bound" फ़ंक्शन एक सेट में एक स्थान लौटने के लिए हैं जहां आप एक कुंजी डाल सकते हैं जो सेट के क्रम का उल्लंघन नहीं करेगा। चूंकि एक एसटीएल सेट का एक पुनरावर्तक अगले तत्व से पहले इंगित करता है, यदि lower_bound(2) ने एक पुनरावर्तक को 0 पर वापस कर दिया है, तो 2 डालने से आपके सेट के क्रम का उल्लंघन होगा, यह अब {2, 0, 3, 4} होगा। ऊपरी बाउंड उस अंतिम स्थान को दिखाने के लिए कार्य करता है जिसे आप सेट ऑर्डर का उल्लंघन किए बिना सम्मिलित कर सकते हैं।

यदि आपके सेट में डुप्लिकेट कुंजी प्रविष्टियां हो सकती हैं तो यह सबसे उपयोगी है। {0, 3, 3, 4} पर विचार करें। lower_bound(3) यहां एक इटरेटर वापस लौटाएगा: {0, *, 3, 3, 4}, जबकि upper_bound(3) इसे यहां वापस कर देगा: {0, 3, 3, *, 4}

+0

सरल स्पष्ट जवाब। – Dan

4

यह lower_bound और upper_bound के व्यवहार पर विचार करने में मदद कर सकता है।

एसटीएल में, श्रेणियां हमेशा बंद-खुली अंतराल होती हैं। दो iterators, first और last द्वारा सीमित सीमा, first और last के बीच के सभी तत्व शामिल हैं, first और last को छोड़कर। अंतराल नोटेशन का उपयोग करके, हम इसे [first, last) के रूप में प्रस्तुत करेंगे।

lower_bound और upper_bound इस तरह परिभाषित कर रहे हैं कि वे रेंज तत्वों कि निर्धारित मूल्य के बराबर की तुलना की। यदि आप lower_bound(x) और upper_bound(x) के बीच पुनरावृत्त करते हैं, तो आप x के बराबर तुलना करने वाले सभी तत्वों पर फिर से सक्रिय होंगे। यदि कोई तत्व x के बराबर नहीं है, तो यह गारंटी है कि lower_bound(x) == upper_bound(x)

यह सुविधा std::map के लिए कम महत्वपूर्ण है, जो हर कुंजी के लिए ज्यादा से ज्यादा एक तत्व है, लेकिन गैर-अद्वितीय साहचर्य कंटेनरों के लिए और nonmember std::lower_bound कि क्रमबद्ध तत्वों की मनमानी दृश्यों के साथ इस्तेमाल किया जा सकता के लिए एक बहुत ही उपयोगी सुविधा है।

[ध्यान दें कि आप प्राप्त करना चाहते हैं तो दोनों निचले और ऊपरी सीमा, आप equal_range बजाय जो दोनों रिटर्न बुलाना चाहिए,।]

+0

शायद अधिक महत्वपूर्ण, यदि आप 'low_bound (n) 'और' upper_bound (m)' के बीच पुनरावृत्त करते हैं, तो आप '[n ... m)' श्रेणी के सभी तत्वों पर जाएं। –

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