2013-10-25 6 views
6

मुझे यकीन नहीं है कि यह क्या करना है - कृपया मुझे बताएं कि नीचे दिए गए कोड में क्या गलत है। मैंने अपने कोड को सरल शब्दों में कम करने के लिए संशोधित किया। MyNode ऑब्जेक्ट्स के समूह के साथ एक std :: वेक्टर है। - पहला कदम इन नोड्स (डेटा m_data) में से एक के डेटा तत्वों में से एक के लिए एक निरंतर संदर्भ प्राप्त करने के लिए है कि नीचे उदाहरण में, वहाँ केवल एक नोड के रूप में नीचे देखा है से पहले 2 नोड डाला जाता है:सी ++ संदर्भ बदलता है जब push_back new element std :: vector

const cv::Data& currData = m_nodesVector[currIndex].GetData(); 
MyNode node(...); 
m_nodesVector.push_back(node); 

बिल्कुल वेक्टर :: push_back कॉल पर, currData के मान में परिवर्तन !! मुझे यह बिलकुल समझ में नहीं आया। वेक्टर में एक नया नोड डालने से पहले नोड के डेटा के मूल्य संदर्भ में परिवर्तन कैसे हो सकता है !! ध्यान दें कि मूल्य दूसरे नोड को "बनाने" पर नहीं बदलता है - लेकिन std :: vector में सम्मिलन ऑपरेशन पर। मेरा मतलब है, मुझे लगता है कि std :: वेक्टर कुछ स्मृति को दोबारा बदल सकता है, लेकिन उस संदर्भ को सही नहीं बदलना चाहिए ??

कंपाइलर = वीएस 2012

धन्यवाद दोस्तों। बहुत सराहना की।

उत्तर

14

वेक्टर में नया नोड डालने से पहले नोड के डेटा के मूल्य संदर्भ में परिवर्तन कैसे हो सकता है !!

क्योंकि वेक्टर के तत्व एक संगत सरणी में संग्रहीत होते हैं। जब सरणी में कोई और कमरा नहीं होता है, तो सभी तत्वों को बड़े आकार में ले जाया जाता है, जो सभी इटरेटर, पॉइंटर्स और संदर्भों को अमान्य कर देते हैं।

मुझे लगता है कि std :: वेक्टर कुछ स्मृति को फिर से बदल सकता है, लेकिन उस संदर्भ को सही नहीं बदला जाना चाहिए ??

बेशक यह होगा। एक संदर्भ किसी विशेष पते पर किसी विशेष वस्तु को संदर्भित करता है; यह स्थानांतरित होने पर ऑब्जेक्ट को ट्रैक नहीं करता है।

यदि आपको स्थिर संदर्भों की आवश्यकता है, तो deque का उपयोग करें; या (यदि संभव हो) वेक्टर की क्षमता को सेट करने के लिए reserve का उपयोग करें जो आप जोड़ सकते हैं। संदर्भ केवल तभी अमान्य होते हैं जब पुनर्वितरण की आवश्यकता होती है, और यह तब होता है जब आप वर्तमान क्षमता से आगे बढ़ने का प्रयास करते हैं।

वैकल्पिक रूप से, आप इसके संदर्भ के बजाय ऑब्जेक्ट की अनुक्रमणिका को स्टोर कर सकते हैं।

3

जब आप वेक्टर में कोई नया आइटम जोड़ते हैं, तो उसमें डेटा को नए आइटम को फिट करने के लिए फिर से आवंटित किया जा सकता है। इसका मतलब है कि वस्तुओं (और उनके सदस्यों) के संदर्भ और पॉइंटर्स अमान्य होंगे।

0

आप सूचक, जब यह ले जाया जाता है, चाल-निर्माता के माध्यम से अद्यतन कर सकते हैं:

A(A&& a): b(a.b) { b.ptr = this; }; 
संबंधित मुद्दे