के लिए एंड्रैटर के सीरेंटिक्स सी ++ मानक के अनुसार, वेक्टर पर push_back()
पर कॉल करने से वेक्टर के नए आकार की क्षमता बढ़ जाती है, लेकिन सूची में यह कभी भी इटरेटर्स को अमान्य नहीं करता है। अब विचार करें निम्नलिखित कोड के टुकड़े:वेक्टर और सूची
1.
vector<int> v{1,2,3};
v.reserve(100);
for (int i: v) {
v.push_back(i);
}
2.
list<int> l{1,2,3};
for (int i: l) {
l.push_back(i);
}
मैं जीसीसी 4.8 के साथ इसे करने की कोशिश और उस कोड पाया v
जा रहा है {1,2,3,1,2,3}
साथ 1 खत्म, लेकिन कोड 2 रन एक अनंत लूप में। स्पष्टीकरण मेरे लिए बहुत आसान लगता है: end()
vector
के संकेतक स्मृति स्थान पर इंगित करते हैं, और it is only evaluated once during a range based for loop से, यह तब होता है जब यह वेक्टर के तीसरे तत्व से पहले पहुंच जाता है। दूसरी तरफ, list
में शायद किसी प्रकार का नल टोकन एक अंत इटरेटर के रूप में होता है, जिसे हमेशा अंतिम तत्व के बाद रखा जाता है, इस प्रकार लूप कभी नहीं पहुंच पाएगा।
जबकि परिणाम सीधे दिखते हैं, मेरा सवाल यह है कि मानक इस बारे में क्या कहता है? क्या यह हर मानक पुस्तकालय कार्यान्वयन में ऐसा होना चाहिए, या यह व्यवहार परिभाषित नहीं है? ऐसे लूप को लिखते समय मुझे क्या उम्मीद करनी चाहिए जो push_back()
को ऐसे कंटेनर पर कॉल कर सकता है (जिसे मैं आमतौर पर किसी भी तरह से बचाना पसंद करता हूं)?
मुझे लगता है कि मानक के बारे में कहने के लिए बहुत कुछ नहीं है। इसकी अनुमति है, यह कानूनी है, यह सिर्फ एक अनंत लूप –
@AndyProwl मुझे लगता है कि मानक के पास कुछ कहना है: यह एक अंतहीन पाश होना आवश्यक है। (यदि यह 'वेक्टर' के साथ एक अंतहीन पाश नहीं है, तो ऐसा इसलिए है क्योंकि अपरिभाषित व्यवहार है, इसलिए कार्यान्वयन कुछ भी कानूनी है।) –
@ जेम्ससांज: ठीक है, यही वही है जो मैं कहना चाहता था। ओपी ने एक कानूनी अनंत लूप लिखा, उस विशेष स्थिति के बारे में मानक कुछ भी कहना नहीं है (पाठ्यक्रम की सूची उदाहरण के बारे में बात करना)। –