2012-08-30 9 views
5

मैं सी के लिए नया हूँ ++ और उत्सुक हूँ अगर यह एक एसटीडी में डालने का पसंदीदा तरीका है :: वेक्टरअसाइनमेंट ऑपरेटर के माध्यम से एक सूचकांक पर एक एसटीडी में सम्मिलित करना :: वेक्टर

std::vector<Object_I_madeup> myVector; 

    void setAt(int x, Object_I_madeup o) 
     { 
      myVector[x] = o; 

     } // set the array location at x to be o. 

मैं क्योंकि पूछना मुझे push_back, या अत्यधिक भ्रमित insert() का उपयोग करने के बारे में बहुत सारी चीज़ें दिखाई देती हैं। क्या यह जावा-जैसा तरीका मान्य है? मैं बहुत कुछ करता हूं ...

+2

क्या आप मतलब है * सम्मिलित किया जाएगा *? क्या आपका मतलब है * सेट * उस स्थिति पर मूल्य? या क्या आपका मतलब है * उस स्थान पर एक तत्व * शेष तत्वों को विस्थापित करना? मुझे आपके * सम्मिलित * भ्रमित करने का उपयोग मिलता है ... –

उत्तर

10
myVector[x] = o; 

यह केवल x < myVector.size() पर अच्छी तरह परिभाषित है। अन्यथा, यह अपरिभाषित व्यवहार का आह्वान करता है, क्योंकि उस स्थिति में यह वेक्टर की सीमा से बाहर तत्व तक पहुंचने का प्रयास करता है।

आप यकीन है कि यह भी बाहर के लिए बाध्य-उपयोग के लिए जाँच करता है बनाना चाहते हैं, तो at() के रूप में उपयोग:

myVector.at(x) = o; 

अब यह अगर x >= myVector.size()std::out_of_range अपवाद फेंक देते हैं। तो आपको यह कोड try-catch ब्लॉक में रखना होगा! उनके बीच का अंतर यहां बहुत विस्तार से चर्चा की गई है।

+0

क्या वेक्टर पर 'डालने' एपीआई भी 'एटीआई' की तरह ही ऑफ-ऑफ़-बाउंड-एक्सेस चेक बनाता है? 'डालें' एपीआई इस अर्थ में अद्वितीय दिखता है कि यह एक int स्थिति पैरामीटर के स्थान पर एक इटरेटर स्थिति पैरामीटर लेता है। मुझे नहीं पता कि मैं वास्तव में एक इटेटरेटर बना सकता हूं w.r.t. एक वेक्टर की स्थिति जो इसके लिए सीमा से बाहर होगी। – RBT

1

यह केवल तभी वैध है जब वेक्टर का आकार कम से कम x + 1 है। यदि ऐसा नहीं है, तो आप इसे सीमा से बाहर कर रहे हैं।

आप इस तरह वेक्टर घोषित हैं:

std::vector<Object_I_madeup> myVector(10); // construct the vector with size 10 
              // and default-initialize its elements 

तो आप सुरक्षित रूप से अनुक्रमित उपयोग कर सकते हैं 0 - 9. उदाहरण में आपका वेक्टर है खाली, हालांकि, वहाँ अभी तक नहीं इसे करने के लिए एक वैध सूचकांक है ।

+0

दूसरे शब्दों में, यदि सूचकांक मान्य नहीं है तो यह आपके लिए वेक्टर का आकार बदल नहीं देगा। –

1

यह मामले में काम करेंगे आप, यह अपने सीमा से बाहर तक पहुँचने का प्रयास नहीं कर रहे हैं अर्थात वेक्टर आकार एक्स से अधिक है। यदि वेक्टर नहीं है

1

आप ArrayList.set() विधि का एक जावा की तरह बराबर के लिए देख रहे हैं, तो आप इसे और अधिक बारीकी के माध्यम से

void setAt(int x, Object_I_madeup o) 
{ 
    myVector.at(x) = o; 
} 

जावा संस्करण की तरह बहुत से कर सकते हैं, vector::at() एक अपवाद फेंक होगा काफी बडा। नोट, यह ऑब्जेक्ट की एक प्रति बनाता है (वास्तव में, दो, क्योंकि आप फ़ंक्शन के मान से भी गुज़र रहे हैं)।

2

myVector[x] = omyVector.push_back(o) (या insert का उपयोग करके) से पूरी तरह से कुछ अलग करता है। इसलिए जो विधि सही है तुम क्या करने कोशिश कर रहे हैं पर निर्भर करता है:

  • myVector[x] = o वेक्टर में सम्मिलित नहीं है, लेकिन o साथ स्थिति x पर तत्व बदल देता है। इसलिए vector की लंबाई बदलती नहीं है और जो मान पहले x पर था, vector में नहीं है। यदि myVector की लंबाई तो x बड़ा नहीं था इस सीमा पहुंच से बाहर होती है, अपरिभाषित व्यवहार
  • myVector.push_back(o) के लिए अग्रणी myVector के अंत में o सम्मिलित होगा।इसलिए इस ऑपरेशन के बाद vector की लंबाई एक से बढ़ी जाएगी और myVector का अंतिम तत्व o होगा। myVector से कोई मान हटा नहीं दिया गया है।
  • myVector.insert(i, o)o को मनमाने ढंग से स्थिति में डालेगा, जिसे इटरेटर i द्वारा निर्दिष्ट किया गया है। इसलिए वेक्टर की लंबाई एक की वृद्धि हुई किया जाएगा और "ith" तत्व (तत्व संख्या myVector.begin() - i) o
संबंधित मुद्दे