2013-04-30 7 views
7

सी ++ संदर्भ के अनुसार, सेट :: डालने को जोड़ी वापस करने के लिए माना जाता है जहां इटरेटर या तो नए डाले गए तत्व को इंगित करता है, या मौजूदा तत्व यदि मौजूद होता है।std :: set :: insert() से इटरेटर वापस लौटा है?

लेकिन मैं इटरेटर को बताए समस्या आ रही है, इस सरल उदाहरण से पता चलता है:

int main() { 
    set<int> set; 
    *set.insert(5).first = 5; 
    return 0; 
} 

मैं जी ++ और बजना और न काम करता है की कोशिश की है।

set.cc:7:24: error: read-only variable is not assignable 
    *set.insert(5).first = 5; 
    ~~~~~~~~~~~~~~~~~~~~^

मैं प्रकार हस्ताक्षर में प्रलेखन इंगित करता है कि इटरेटर एक स्थिरांक वस्तु के सम्मान करना चाहिए में कुछ भी, और कुछ भी नहीं इस या तो संकेत मिलता है नहीं मिल रहा। क्या कोई मुझे समझने में मदद कर सकता है कि यह क्यों काम नहीं करता है?

उत्तर

13

std::set के लिए, इसके iterator और const_iterator प्रकार दोनों लगातार द्विपक्षीय इटरेटर हैं। इसका कारण यह है कि std::set का आदेश दिया गया है। यदि आप एक इटरेटर के रूप में सेट के तत्व को संशोधित करना चाहते थे, तो आप उस ऑर्डरिंग को तोड़ देंगे।

आदेशित तत्व {1, 4, 8} के साथ std::set पर विचार करें। यदि आपने *set.insert(5).first = 10; (यदि इसकी अनुमति थी) की तरह कुछ किया, तो पहले 5{1, 4, 5, 8} प्राप्त करने के लिए डाला जाएगा और फिर डाला गया तत्व {1, 4, 10, 8} प्राप्त करने के लिए 10 पर सेट किया जाएगा। ऑर्डरिंग आविष्कार अब टूट गया है।

चूंकि आप 5insert(5) के साथ डालने के बाद से, इटरेटर को कम करने और 5 को असाइन करने का कोई कारण नहीं है।

+0

डुह। मुझे इसके बारे में सोचना चाहिए था। धन्यवाद। मेरे असली उदाहरण में, यह एक int नहीं था, यह एक और जटिल वस्तु थी जिसे मैं कुछ राज्य बदलना चाहता था। – drwowe

4

आप किसी सेट के सदस्यों को जगह में संशोधित नहीं कर सकते हैं। यह एक आदेश दिया गया कंटेनर है। इसके iterators असाइन करने योग्य नहीं हैं।

3

सी ++ 11 में, सेटरेटर const प्रकारों को देखें (set reference देखें)। यदि आप इसके बारे में सोचते हैं तो यह समझ में आता है, क्योंकि एक सेट अपने तत्व को ऑर्डर करता है, और केवल एक निश्चित तत्व को बदलने से ऑर्डरिंग बाधाओं का अधिकतर उल्लंघन होता है।

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