2011-12-25 23 views
12

द्वारा तत्व बदलें जब मुझे इटरेटर का उपयोग करके सेट के तत्व को बदलना है तो मुझे समस्या है। यह सरल कोड समझा सकता है कि मैं क्या करना चाहता हूं।इटरेटर

set<int> s; 
    s.insert(12); 

    set<int>::iterator it = s.begin(); 
    *it = 4; // error C3892: 'it' : you cannot assign to a variable that is const 

मैं सामान्य इटरेटर द्वारा निर्धारित मान को क्यों नहीं बदल सकता, न कि const_iterator?

मेरे कोड में इटेटरेटर सेट :: find() द्वारा वापस किया गया था। सेट से विशिष्ट तत्व चुनने और उसे बदलने का शायद बेहतर तरीका है।

उत्तर

12

एक सेट एक आदेश दिया गया कंटेनर है (विशेष रूप से उन्हें संतुलित बाइनरी खोज पेड़ों के रूप में लागू किया जाता है)। यदि आप इटरेटर के माध्यम से तत्व के मान को बदलने में सक्षम थे तो ऑर्डर इनवेरिएंट टूटा जाएगा। आप जो हासिल करने की कोशिश कर रहे हैं उसके आधार पर आप एक अलग कंटेनर के साथ बेहतर हो सकते हैं या मूल्य प्राप्त कर सकते हैं, तत्व को हटा सकते हैं और सेट में एक नया तत्व डालेंगे।

+3

+1: हालांकि यह सवाल छोड़ देता है: क्यों 'शुरू' एक non-'const' iterator लौटाता है? –

+0

एक सामान्य इटरेटर लौटाना भ्रमित है, लेकिन अब कम से कम समझ में आता है कि मुझे यह त्रुटि क्यों मिलती है। बहुत बहुत धन्यवाद। – Scypi

+0

@ ओली चेहरल्सवर्थ, स्सीपी: यह थोड़ा सा ट्रिकियर है, इटेटरेटर 'const_iterator' नहीं है, लेकिन एक * mutable * iterator है। यह 'कुंजी' है जिसे * अपरिवर्तनीय * अनुक्रमित किया जा सकता है। §23.2.4p5 * "[...] एक सहयोगी कंटेनर में कुंजी अपरिवर्तनीय हैं।" * क्यों वे गैर-कॉन्स 'शुरू() 'और अंत (' const_iterator' की बजाय हमेशा) प्रदान करते हैं, मेरा अनुमान है कि यह है कंटेनर इंटरफेस को यथासंभव वर्दी रखने के लिए किया गया। विशेष रूप से §23.2.4p6 में कहा गया है कि इस मामले में 'iterator' और 'const_iterator' * समान हो सकते हैं, और ओडीआर उल्लंघनों से बचने के लिए हमेशा' const_iterator' का उपयोग करके सुझाव देते हैं। –

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