C++ में, हमारे पास vector, list, set, map आदि जैसे विभिन्न कंटेनर हैं। इन कंटेनर्स के माध्यम से पुनरावृति करने के लिए, हम इटरेटर्स का उपयोग कर सकते हैं। हमें C++ में इटरेटर्स का उपयोग करते समय सावधान रहना चाहिए। जब हम किसी कंटेनर पर पुनरावृति कर रहे होते हैं, तो कभी-कभी, यह अमान्य हो सकता है। यदि आकार, साइज़ बदलता है, तो हम इस तरह की समस्याओं का सामना कर सकते हैं। निम्नलिखित उदाहरण में, हम अमान्यता की समस्या की पहचान कर सकते हैं।
उदाहरण कोड
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec{11, 55, 110, 155, 220};
for (auto it = vec.begin(); it != vec.end(); it++)
if ((*it) == 110)
vec.push_back(89); // वेक्टर पर पुनरावृति करते समय एक नया मान डालना
for (auto it = vec.begin(); it != vec.end(); it++)
cout << (*it) << " ";
return 0;
}
आउटपुट
11 55 110 155 220 89 89
इस प्रोग्राम में हमें विभिन्न प्रकार के परिणाम मिल सकते हैं। यहां वेक्टर का आकार पहले से परिभाषित नहीं है। इनिशियलाइज़ेशन के लिए कुछ मान प्रदान किए गए हैं। अब पुनरावृति करते समय, हम एक और मान जोड़ रहे हैं। इस मामले में, यदि वेक्टर के पास कोई स्थान नहीं है, तो यह रनटाइम पर एक नया मेमोरी ब्लॉक बनाएगा, और सभी आइटम कॉपी हो जाएंगे। लेकिन इटरेटर पिछले पते पर इशारा करेगा। इसके लिए यह कुछ अमान्यता उत्पन्न कर सकता है।
आइए इटरेटर अमान्यता के कुछ नियम देखते हैं।
| इन्सर्शन | इरेज़र | रिसाइज़िंग | |
|---|---|---|---|
| Vector | इन्सर्शन पॉइंट से पहले इशारा करने वाले सभी इटरेटर्स अप्रभावित हैं, लेकिन अन्य अमान्य हो जाते हैं। और यदि वेक्टर का आकार बढ़ता है, तो सभी इटरेटर्स अमान्य हो जाते हैं। | डिलीशन पॉइंट के बाद के सभी इटरेटर्स और रेफरेंस अमान्य हो जाते हैं। | इन्सर्ट या इरेज़ के समान। |
| Deque | यदि डाला गया आइटम डेक के अंत में नहीं डाला गया है, तो सभी इटरेटर्स और रेफरेंस अमान्य हो जाते हैं। | यदि आइटम्स को अंत की स्थिति को छोड़कर किसी भी स्थिति से हटाया जाता है, तो सभी इटरेटर्स अमान्य हो जाएंगे। | इन्सर्ट या इरेज़ के समान। |
| List | सभी इटरेटर्स और रेफरेंस अप्रभावित | केवल वे इटरेटर्स या रेफरेंस प्रभावित होते हैं जो उस एलिमेंट की ओर इशारा कर रहे हैं जिसे मिटाया जाएगा। | इन्सर्ट या इरेज़ के समान। |
| Set, map, multiset, multimap | सभी इटरेटर्स और रेफरेंस अप्रभावित | केवल वे इटरेटर्स या रेफरेंस प्रभावित होते हैं जो उस एलिमेंट की ओर इशारा कर रहे हैं जिसे मिटाया जाएगा। | ---- |