के दौरान वेक्टर में तत्व जोड़ें I मैंने सी ++ 11 मानक द्वारा प्रदान किए गए लूप के लिए नई श्रेणी-आधारित उपयोग किया है और मैं निम्नलिखित प्रश्न के साथ आया हूं: मान लीजिए कि हम vector<>
पर पुन: प्रयास करते हैं श्रेणी-आधारित for
का उपयोग करके, और हम इस पुनरावृत्ति के दौरान वेक्टर के अंत में कुछ तत्व जोड़ते हैं। इस प्रकार, लूप अंत कब करते हैं?रेंज-आधारित लूप सी ++ 11
उदाहरण के लिए, इस कोड को देखें:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<unsigned> test({1,2,3});
for(auto &num : test) {
cout << num << " ";
if(num % 2)
test.push_back(num + 10);
}
cout << "\n";
for(auto &num : test)
cout << num << " ";
return 0;
}
मैं के साथ "-std = C++ 11" झंडा जी ++ 4.8 और एप्पल LLVM संस्करण 4.2 (बजना ++) का परीक्षण किया है, और उत्पादन (दोनों के लिए) है :
1 2 3
1 2 3 11 13
ध्यान दें कि पहला लूप मूल वेक्टर के अंत में समाप्त हो जाता है, हालांकि हम इसमें अन्य तत्व जोड़ते हैं। ऐसा लगता है कि फॉर-रेंज लूप केवल शुरुआत में कंटेनर अंत का मूल्यांकन करता है। क्या यह वास्तव में, सीमा के सही व्यवहार के लिए है? क्या यह समिति द्वारा निर्दिष्ट है? क्या हम इस व्यवहार में भरोसा कर सकते हैं?
नोट अगर हम अवैध iterators साथ द्वारा
for(vector<unsigned>::iterator it = test.begin(); it != test.end(); ++it)
पहले पाश बदल सकते हैं और एक विभाजन गलती के साथ आते हैं कि।
हालांकि जोड़ना मिटाना नहीं है, यह एक डुप्लिकेट है [लूप के लिए एक श्रेणी के अंदर एक कंटेनर से तत्व मिटा रहा है] (http://stackoverflow.com/questions/8624686/erasing-an-element- एक-कंटेनर-जबकि-अंदर-ए-रेंज-आधारित-फॉर-लूप) क्योंकि उत्तर आपको दिखाता है कि मानक कहता है कि मानक क्या है - अंत के लिए निर्धारित होता है और लूप शुरू होने से पहले सहेजा जाता है, और सहेजा गया मूल्य बाद के पुनरावृत्तियों पर प्रयोग किया जाता है। –
@ केटग्रेगरी मैं तर्क दूंगा कि यह एक डुप्लिकेट नहीं है क्योंकि मौजूदा तत्व को हटाने से सभी कंटेनरों के लिए अपरिभाषित व्यवहार होगा, लेकिन तत्व जोड़ना केवल 'std :: vector', 'std :: deque',' std: : unordered_set' और 'std :: unorderd_map'। –
मुझे लगता है कि व्यवहार, व्यवहार से थोड़ा अलग है। कोई बात नहीं धन्यवाद। –