Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

सी ++ में इटरेटर अमान्यता

सी ++ में, हमारे पास वेक्टर, सूची, सेट, मानचित्र इत्यादि जैसे विभिन्न कंटेनर हैं। इन कंटेनरों के माध्यम से पुनरावृत्त करने के लिए, हम इटरेटर्स का उपयोग कर सकते हैं। जब हम 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); //inserting a new value while iterating the vector
      for (auto it=vec.begin();it!=vec.end();it++)
         cout << (*it) << " ";
}
के लिए वेक्टर को पुनरावृत्त करते हुए एक नया मान डालना

आउटपुट

11 55 110 155 220 89 89

इस कार्यक्रम में हम विभिन्न प्रकार के परिणाम प्राप्त कर सकते हैं। यहाँ सदिश का आकार पहले परिभाषित नहीं किया गया है। आरंभीकरण के लिए कुछ मान दिए गए हैं। अब पुनरावृति करते हुए, हम एक और मूल्य जोड़ रहे हैं। इस मामले में, यदि वेक्टर के पास कोई स्थान नहीं है, तो यह एक नया मेमोरी ब्लॉक एटरनटाइम बनाएगा, और सभी आइटम कॉपी किए जाएंगे। लेकिन इटरेटर को पिछले पते पर इंगित किया जाएगा। इसके लिए यह कुछ अमान्यताएँ उत्पन्न कर सकता है।

आइए हम पुनरावृत्त अमान्यताओं के लिए कुछ नियम देखें।


<वें शैली ="चौड़ाई:40.7483%; पाठ-संरेखण:केंद्र;">सम्मिलन
<वें शैली ="पाठ-संरेखण:केंद्र; चौड़ाई:26.7347%;">मिटाएं
<वें शैली ="चौड़ाई:12.0408%;"> आकार बदलना
वेक्टर
सभी इटरेटर्स, जो इंसर्शन पॉइंट से पहले किसी तत्व को इंगित कर रहे हैं, अप्रभावित हैं, लेकिन अन्य अमान्य हैं। और यदि वेक्टर का आकार बढ़ा दिया जाता है, तो सभी पुनरावृत्तियों को अमान्य कर दिया जाता है।
सभी पुनरावर्तक, और संदर्भ, जो विलोपन बिंदु के बाद हैं, अमान्य हैं।
सम्मिलित या मिटाने जैसा ही है।
Deque
सभी पुनरावृत्तियों और संदर्भों को अमान्य कर दिया जाता है यदि सम्मिलित आइटम को डेक के अंत में सम्मिलित नहीं किया जाता है।
यदि अंतिम स्थिति को छोड़कर किसी भी स्थिति से आइटम हटा दिए जाते हैं, तो सभी पुनरावर्तक अमान्य हो जाएंगे।
सम्मिलित या मिटाने जैसा ही है।
सूची
सभी पुनरावर्तक और संदर्भ अप्रभावित हैं
केवल वे इटरेटर, या संदर्भ, जो उस तत्व की ओर इशारा करते हैं जिसे मिटाया जाएगा, प्रभावित होते हैं।
सम्मिलित या मिटाने जैसा ही है।
सेट, मैप, मल्टीसेट, मल्टीमैप
सभी पुनरावर्तक और संदर्भ अप्रभावित हैं
केवल वे इटरेटर, या संदर्भ, जो उस तत्व की ओर इशारा करते हैं जिसे मिटाया जाएगा, प्रभावित होते हैं।
----

  1. C++ में बाइनरी सर्च ट्री इटरेटर

    मान लीजिए हम बाइनरी ट्री के लिए एक इटरेटर बनाना चाहते हैं। दो तरीके होंगे। अगला () विधि अगले तत्व को वापस करने के लिए है, और hasNext () विधि बूलियन मान वापस करने के लिए है, जो इंगित करेगा कि अगला तत्व मौजूद है या नहीं। तो अगर पेड़ जैसा है - और फ़ंक्शन कॉल का क्रम [अगला (), अगला (), है नेक्स्ट (),

  1. C++ में आउटपुट इटरेटर्स

    यहां हम देखेंगे कि C++ में Output iterators क्या हैं। आउटपुट इटरेटर्स में कुछ गुण होते हैं। ये नीचे की तरह हैं: आउटपुट इटरेटर्स का उपयोग कंटेनरों के मूल्य को संशोधित करने के लिए किया जाता है। हम इस तरह के इटरेटर का उपयोग करके कंटेनर से डेटा नहीं पढ़ सकते हैं यह वन-वे है और केवल इटरेटर लिखें इसे बढ़

  1. सी # में इटरेटर

    Iterator संग्रह पर एक कस्टम पुनरावृत्ति करता है। यह यील्ड रिटर्न स्टेटमेंट का उपयोग करता है और प्रत्येक तत्व को एक बार में लौटाता है। इटरेटर वर्तमान स्थान को याद रखता है और अगले पुनरावृत्ति में अगला तत्व वापस आ जाता है। निम्नलिखित एक उदाहरण है - उदाहरण using System; using System.Collections.Generic