কম্পিউটার টিউটোরিয়াল

C++-এ ইটেরেটর ইনভ্যালিডেশন (Iterator Invalidation)

C++-এ আমাদের vector, list, set, map ইত্যাদি বিভিন্ন কন্টেইনার রয়েছে। এই কন্টেইনারগুলোতে ইটারেট করার জন্য আমরা ইটেরেটর ব্যবহার করি। C++-এ ইটেরেটর ব্যবহার করার সময় আমাদের সতর্ক থাকতে হয়। যখন আমরা একটি কন্টেইনার ওভার ইটারেট করছি, তখন কখনও কখনও সেটি ইনভ্যালিডেট (invalidated) হতে পারে। যদি শেপ (shape) বা সাইজ (size) পরিবর্তন হয়, তবে আমরা এই ধরনের সমস্যায় পড়তে পারি। নিচের উদাহরণে আমরা ইনভ্যালিডেশনের সমস্যা চিহ্নিত করতে পারব।

উদাহরণ কোড (ইনভ্যালিডেশন সমস্যা)

#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) << " ";
}

আউটপুট

11 55 110 155 220 89 89

এই প্রোগ্রামে আমরা বিভিন্ন ধরনের ফলাফল পেতে পারি। এখানে ভেক্টরের সাইজ পূর্বে ডিফাইন করা নেই। ইনিশিয়ালাইজেশনের জন্য কিছু ভ্যালু দেওয়া আছে। এখন ইটারেট করার সময়, আমরা একটা নতুন ভ্যালু যোগ করছি। এই কেসে, যদি ভেক্টরের স্পেস না থাকে, তবে রানটাইমে এটি নতুন মেমরি ব্লক তৈরি করবে এবং সব আইটেম কপি হবে। কিন্তু ইটেরেটর আগের অ্যাড্রেসকে পয়েন্ট করবে। এইজন্যে ইনভ্যালিডেশন হতে পারে।

ইটেরেটর ইনভ্যালিডেশনের কিছু নিয়ম নিচে দেওয়া হলো:

ইনসারশন (Insertion) ইরেজার (Erasure) রিসাইজিং (Resizing)
Vector ইনসারশন পয়েন্টের আগে যে ইটেরেটরগুলো পয়েন্ট করছে, সেগুলো অপ্রভাবিত, বাকিগুলো ইনভ্যালিডেট। এবং যদি ভেক্টরের সাইজ বাড়ে, তবে সব ইটেরেটর ইনভ্যালিডেট। ডিলিশন পয়েন্টের পরে যে সব ইটেরেটর এবং রেফারেন্স, সেগুলো ইনভ্যালিডেট। ইনসারশন বা ইরেজারের মতো।
Deque যদি ইনসার্ট করা আইটেম ডিকের শেষে না হয়, তবে সব ইটেরেটর এবং রেফারেন্স ইনভ্যালিডেট। যদি আইটেম যেকোনো পজিশন থেকে ডিলিট করা হয় শেষ পজিশন বাদে, তবে সব ইটেরেটর ইনভ্যালিডেট। ইনসারশন বা ইরেজারের মতো।
List সব ইটেরেটর এবং রেফারেন্স অপ্রভাবিত। শুধু যেসব ইটেরেটর বা রেফারেন্স মুছে ফেলা এলিমেন্টকে পয়েন্ট করছে, সেগুলোই প্রভাবিত। ইনসারশন বা ইরেজারের মতো।
Set, map, multiset, multimap সব ইটেরেটর এবং রেফারেন্স অপ্রভাবিত। শুধু যেসব ইটেরেটর বা রেফারেন্স মুছে ফেলা এলিমেন্টকে পয়েন্ট করছে, সেগুলোই প্রভাবিত। ----
  1. C++-এ বাইনারি সার্চ ট্রি ইটারেটর (Binary Search Tree Iterator)

  2. C++-এ বাইডিরেকশনাল ইটেরেটর (Bidirectional Iterators)

  3. C++-এ আউটপুট ইটেরেটর (Output Iterators)

  4. C#-এ ইটেরেটর (Iterators)