2013-04-06 10 views
11

क्यों इस कोडमुझे "वेक्टर इटरेटर्स असंगत" क्यों मिल रहा है?

#include <algorithm> 
#include <iterator> 
#include <vector> 

int main() 
{ 
    std::vector<int> v; 
    v.push_back(1); 
    v.push_back(2); 
    v.push_back(3); 
    v.reserve(v.size() * 2); // Reserve enough space to keep iterators valid 
    std::copy(v.begin(), v.end(), std::back_inserter(v)); 
    return 0; 
} 

मुझे डिबग जोर विफलता देता है, अभिव्यक्ति: वेक्टर Iterators असंगत (विजुअल C++ 2008)?

उत्तर

14

तत्वों से संबंधित इटरेटर्स केवल तभी अमान्य होते हैं जब वेक्टर को फिर से आवंटित किया जाता है, जोबचाता है।

हालांकि, v.end() मान्य नहीं रहेगा।

push_back और insert गारंटी के मानक का वर्णन है कि

पुनः आबंटन का कारण बनता है, तो नया आकार वर्ष क्षमता से अधिक है। यदि कोई पुनर्वितरण नहीं होता है, सम्मिलन बिंदु से पहले सभी पुनरावृत्तियों और संदर्भ मान्य रहते हैं।

v.end() "सम्मिलन बिंदु से पहले" नहीं है।

+2

+1 डांग ... यह बहुत परेशान है। सबसे अच्छा कामकाज क्या है? – Mehrdad

+0

सूचकांक पर एक 'फॉर लूप ऑपरेटिंग? –

+0

@ मेहरदाद, मुझे कल्पना नहीं है कि 'डालने' इस गड़बड़ी से बचाता है? – chris

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