2012-10-11 21 views
15

में साफ़ करें मुझे एक वेक्टर पर लागू होने पर सी ++ स्पष्ट फ़ंक्शन के व्यवहार को समझने में कुछ कठिनाइयां हैं।वेक्टर :: सी ++

मैं संकलन और निम्नलिखित समारोह भागने की कोशिश की:

#include <iostream> 
#include <vector> 
using namespace std; 

int main() 
{ 
    unsigned int i; 
    vector<int> myvector; 
    myvector.push_back (1); 
    myvector.push_back (2); 
    myvector.push_back (3); 

    cout << "myvector contains:"; 
    for (i=0; i<myvector.size(); i++) cout << " " << myvector[i]; 

    myvector.clear(); 
    myvector.push_back (11); 
    myvector.push_back (12); 

    cout << "\nmyvector contains:"; 
    for (i=0; i<myvector.size(); i++) cout << " " << myvector[i]; 
    cout << endl; 

    cout << " entry3 = " << myvector[2]<<endl; 

    return 0; 
} 

और यह उत्पादन होता है:

myvector contains: 1 2 3 
myvector contains: 11 12 
entry3 = 3 

कैसे है यह संभव नहीं है कि वेक्टर के तीसरे प्रवेश की जानकारी वेक्टर को साफ़ करते समय मिटा दिया गया है?

+2

ऑपरेटर [] सूचकांक की लंबाई-मान्य नहीं है। .at (n) के साथ उसी ऑपरेशन को आज़माएं और देखें कि क्या होता है। – WhozCraig

उत्तर

22

डॉक्स से:

सभी वेक्टर के तत्वों को शामिल नहीं किया जाता: अपने विनाशकर्ता कहा जाता है, और फिर वे वेक्टर कंटेनर से निकाल दिए जाते हैं, 0.

के आकार के साथ कंटेनर छोड़ने

असल में आप अवांछित व्यवहार पर myvector[2] पर आ रहे हैं क्योंकि वह आइटम अब मौजूद नहीं है। clear() पर कॉल करने के बाद आपने केवल वेक्टर में 2 तत्वों को धक्का दिया, इसलिए केवल 0 और 1 सूचकांक उपलब्ध हैं।

आप दुर्भाग्यपूर्ण हैं कि यह क्रैश नहीं हुआ, क्योंकि काम करने से पहले बग छुपा सकते हैं। इस बात की कोई गारंटी नहीं है कि मूल्य मिटा दिया गया है।

इसके बजाय .at(2) के साथ तत्व तक पहुंचने का प्रयास करने के परिणामस्वरूप एक अपवाद फेंक दिया जाएगा (operator[]() कोई बाध्य-जांच नहीं करता है, जबकि at() करता है)।

7

यदि आप debug मोड में इस कोड को चलाने का प्रयास करते हैं, तो संभवतः यह एक डीबग दावे के साथ क्रैश हो जाएगा। एक सरणी के अंत के संदर्भ में संदर्भ अपरिभाषित व्यवहार है।

वास्तव में क्या हो रहा है यह है कि वेक्टर ने clear() चलाने से पहले उपयोग की गई स्मृति को मिटा नहीं दिया है। यह स्मृति अभी भी मौजूद है लेकिन यह परिभाषित नहीं है कि यदि आप इसे एक्सेस करते हैं तो क्या होगा। एक वेक्टर के अंत से बाहर निकलने से बचने के लिए सीमाओं की जांच करने के लिए आप पर निर्भर है। आप इसे size() के साथ सीमाओं के रूप में लूप करके या at() का उपयोग करके और out_of_range अपवाद को पकड़कर कर सकते हैं। मैं विशेष रूप से इस बाद के दृष्टिकोण की अनुशंसा नहीं करता क्योंकि चूंकि रनटाइम चेक के लिए अपवादों का उपयोग करना एक अच्छा विचार नहीं है।

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