std::vector
जैसे कंटेनर वर्ग के साथ, निरंतर-नस्ल की दो अलग-अलग अवधारणाएं हैं: कंटेनर (यानी इसका आकार) और तत्वों का। ऐसा लगता है कि इन दो std::vector
, confuses ऐसी है कि निम्नलिखित सरल कोड संकलन नहीं होगा:कंटेनर का बनाम गैर-कॉन्स और इसकी सामग्री
struct A {
A(size_t n) : X(n) {}
int&x(int i) const { return X[i]; } // error: X[i] is non-const.
private:
std::vector<int> X;
};
नोट है कि भले ही डेटा सदस्यों को (तीन संकेत दिए गए डेटा और अंत की & अंत शुरू आवंटित बफर का) std::vector
operator[]
पर कॉल द्वारा बदला गया, यह सदस्य const
नहीं है - क्या यह एक अजीब डिज़ाइन नहीं है?
भी ध्यान रखें कि कच्चे संकेत के लिए, निरंतर सत्ता के इन दो अवधारणाओं बड़े करीने से अलग होती है, जैसे कि इसी कच्चे सूचक कोड
struct B {
B(size_t n) : X(new int[n]) {}
~B() { delete[] X; }
void resize(size_t n); // non-const
int&x(int i) const { return X[i]; } // fine
private:
int*X;
};
काम करता है ठीक।
तो std::vector
(mutable
का उपयोग किए बिना) के साथ निपटने के लिए सही/अनुशंसित तरीका क्या है?
(, इसलिए कोई यूबी यहाँ X
गैर const
माना जाता है) एक const_cast<>
रूप
int&A::x(int i) const { return const_cast<std::vector<int>&>(X)[i]; }
में स्वीकार्य समझा है?
संपादित बस आगे भ्रम को रोकने के लिए: मैं तत्वों, कंटेनर की अर्थात सामग्री लेकिन संशोधित करना चाहते हैं नहीं कंटेनर ही (आकार और/या स्मृति स्थान)।
'std :: vector' का डेटा आपके कॉल द्वारा 'ऑपरेटर []' में बदला जा सकता है। जैसा कि आपने 'ए :: एक्स',' ए.एक्स (1) ++ लिखा है, 'पूरी तरह से कानूनी है, और वेक्टर की सामग्री को संशोधित करता है। –
@ डेविडस्वार्टज़ * वेक्टर का * सामग्री * वास्तविक * डेटा * नहीं है (हालांकि आप उन्हें तर्कसंगत रूप से इस तरह से जोड़ सकते हैं)। यदि आप 'std :: vector' का निरीक्षण करते हैं, तो इसमें डेटा के रूप में केवल 3 पॉइंटर्स हैं (डेटा का प्रारंभ और अंत और बफर का अंत)। ये अपरिवर्तित रहते हैं। – Walter