2009-06-11 11 views
8

यह मेरे सरल परीक्षण से प्रतीत होता है लेकिन मुझे आश्चर्य है कि यह गारंटी है या नहीं?क्या एसटीएल मानचित्र हमेशा प्रारंभ() से अंत() तक पुनरावृत्ति करते समय एक ही ऑर्डर देता है?

क्या ऐसी स्थितियां हैं जहां ऑर्डरिंग की गारंटी नहीं दी जाएगी?

संपादित करें: यदि मैं विशेष रूप से दिलचस्पी लेता हूं तो क्या मैं बड़ी संख्या में प्रविष्टियों वाले मानचित्र को पॉप्युलेट करता हूं, क्या यह निष्पादन योग्य के कई रनों पर इटर्टेटर का क्रम समान होगा? क्या होगा अगर प्रविष्टियों को एक अलग क्रम में डाला जाता है?

+0

आप तत्वों की गारंटी आदेश की जरूरत है, क्या आप संरचना की तरह सूची का उपयोग नहीं कर रहे हैं? परिभाषा के आधार पर एक आदेश नहीं है क्योंकि मूल्यों को उनके कुंजी को हराकर निर्धारित स्थानों पर रखा जाता है। – Gishu

+1

ऑर्डरिंग और अनुक्रम के बीच अंतर नोट करें। सूची, वेक्टर और डेक्यू अनुक्रम कंटेनर हैं। सेट और मानचित्र आदेश कंटेनर हैं। – Flame

उत्तर

9

हां, यह एक आंतरिक क्रम बनाए रखता है, इसलिए एक सेट पर पुनरावृत्ति जो बदल नहीं रहा है हमेशा वही होना चाहिए। here से:

आंतरिक रूप से, नक्शा में तत्वों कम से उच्च कुंजी मूल्य के लिए एक विशिष्ट सख्त कमजोर आदेश कसौटी निर्माण पर सेट निम्नलिखित हल कर रहे हैं।

+0

glibc में, यह एक लाल-काला पेड़ है। जबकि सख्त क्रम एसटीएल स्पेक में नहीं है, यह वास्तविक तथ्य है। –

+0

@ जेफैमफोन और यदि आपकी कुंजी किसी ऑब्जेक्ट के लिए पॉइंटर है तो आप अपने प्रोग्राम के कई रनों में ऑर्डर कर सकते हैं .... ठीक है जो बताता है कि यह नहीं है :) –

+0

@ जैमी कुक: तकनीकी रूप से, पॉइंटर्स हैं वैध कुंजी नहीं (कम से कम डिफ़ॉल्ट std :: कम तुलनित्र के साथ) क्योंकि कोई ऑपरेटर नहीं है <पॉइंटर्स के लिए परिभाषित किया गया है (हालांकि आप इसे बिना हस्ताक्षर किए लंबे समय तक कास्टिंग करके नकली कर सकते हैं)। –

0

क्या एक एसटीएल मानचित्र अपरिवर्तित होने पर प्रारंभ/समाप्ति के साथ एक ही आदेश दे सकता है? हाँ। यदि आप नक्शा बदलते हैं, तो वही शेष क्रम पर निर्भर न करें।

+0

... लेकिन अपरिवर्तित तत्वों का क्रम वही रहता है - परिभाषित आदेश के अनुसार अनुक्रम में उचित स्थान पर कोई सम्मिलन या हटाना दिखाई देगा। ऐसा कहने के लिए, मानचित्र में किए गए परिवर्तन पूरी तरह से अनुमानित तरीकों से पुनरावृत्ति आदेश को बदल देंगे। –

-2

उसी डेटा पर एसटीएल के समान कार्यान्वयन के तहत सेट किया गया है, हां। जहां तक ​​मुझे पता है, विभिन्न कार्यान्वयनों में समान होने की गारंटी नहीं है।

+1

यह तब तक सभी कार्यान्वयन में समान होने की गारंटी है जब तुलनित्र एक वैध सख्त कमजोर आदेश प्रदान करता है - अन्यथा सभी दांव बंद हैं! –

+0

तो यह गारंटी है जब तक यह नहीं है? :) –

6

std::map हाँ, आदेश की गारंटी है (आदेश आप अपने निर्माता में परोक्ष या स्पष्ट का उपयोग के रूप में ही), एक अनुसार क्रमबद्ध कंटेनर है, इसलिए। लोकप्रिय (हालांकि अभी तक-स्टैनर्ड) hashmap के लिए इस पर भरोसा नहीं है - हालांकि std::map पर कई मामलों में इसका बहुत से फायदे हैं, लेकिन पुनरावृत्ति के अनुमानित क्रम नहीं हैं!

+1

सी ++ 0x में हैश आधारित मानचित्र/सेट को unordered_map/unordered_set कहा जाता है। आदेश देने के बारे में यह बिल्कुल स्पष्ट है। – Flame

1

std :: नक्शा एक क्रमबद्ध संग्रह
है और आप ऑपरेटर
कल्पना मीटर प्रकार टी का एक नक्शा है की तुलना में कम परिभाषित करना होगा:

assert(m.size() > 1); 
for (std::map<T>::const_iterator i = m.begin(); i != m.end(); ++i) { 
    std::map<T>::const_iterator j = i + 1; 
    while (j != m.end()) { 
     assert(*i < *j); 
     ++j; 
    } 
}