আমি নিজে এসটিএল পড়ার সময় সবচেয়ে বেশি কষ্ট হয়েছিল এই ইটারেটর জিনিসটা নিয়ে। এই পর্বে যতটা সহজভাবে পারি ব্যাপারটা বুঝানোর চেষ্টা করবো। সহজভাবে বললে, ইটারেটর হল অনেকটা সি পয়েন্টারের মত, যা কন্টেইনারের বিভিন্ন বস্তুর অবস্থানকে নির্দেশ করে। কন্টেইনার কী মনে আছে তো? ভেক্টর, স্ট্যাক, কিউ – এসবই হল কন্টেইনার, যারা এক বা একাধিক বস্তু কন্টেইন করে রাখে!

সব কন্টেইনার begin নামের একটা ইটারেটর সাপোর্ট করে, যার সাথে আমরা ইতোমধ্যে পরিচিত। আমরা v নামের কোনো ভেক্টরের ক্ষেত্রে v.begin() লিখলে সেটা সেই ভেক্টরের শুরুটা পয়েন্ট করতো। একইভাবে সব কন্টেইনার end নামের আরেকটি ইটারেটর সাপোর্ট করে, যা পয়েন্ট করে কন্টেইনারের শেষ। এর সাথেও আমরা ইতোমধ্যেই পরিচিত! বাহ, শুরু করার আগেই দুইটি জিনিস জানা শেষ আমাদের। 😀

এবার আমরা দেখবো ইটারেটর ডিক্লেয়ার করে কীভাবে

ইটারেটর ডিক্লেয়ার করার জন্য আমরা লিখবোঃ

class_name<template_parameters>::iterator name 

/* amra (using namespace std;) lekhate alada vabe bolte hocche na std namespace use korbo */

যেমন আমরা ইন্টিজারের ভেক্টরের একটি ইটারেটর i1 এবং char-এর একটি ভেক্টরের ইটারেটর i2 ডিক্লেয়ার করবো এভাবেঃ

vector <int> :: iterator i1;
vector <char> :: iterator i2;

আমরা ইটারেটরের ক্ষেত্রে যেসব অপারেটর ব্যবহার করতে পারবো

  • আমরা এক ইলিমেন্ট থেকে তার পরবর্তী ইলিমেন্টে ইটারেটরটিকে নিয়ে যেতে পারি ++ অপারেটর দিয়ে
  • একইভাবে এক ইলিমেন্ট থেকে তার আগের ইলিমেন্টে ইটারেটরটিকে নিয়ে যেতে পারি অপারেটর দিয়ে
  • দুইটি ইটারেটর একই কি না, চেক করে দেখতে পারি == অপারেটর দিয়ে
  • পয়েন্টারের মত ডিরেফারেন্স করতে পারি * অপারেটর দিয়ে

নিচের কোডটা দেখঃ

#include <iostream>
#include <vector>
using namespace std;
int main() {
    vector<int> amarVector;
    vector<int>::iterator amarVectorErIterator;

    amarVector.push_back(1);
    amarVector.push_back(2);
    amarVector.push_back(3);

    for(amarVectorErIterator = amarVector.begin(); amarVectorErIterator != amarVector.end(); amarVectorErIterator++) {
        cout << *amarVectorErIterator<<" "; // dereference
    }
    return 0;
}

এবার তোমার কাজ হবে ডিক্রিমেন্ট (–) অপারেটর ব্যবহার করেও একই কাজটা করে দেখা!

এখন ধর তোমার কাছে ১০০ টা ইলিমেন্টের একটা ভেক্টর আছে। এখন তুমি এর ২১ থেকে ৪০ তম ইলিমেন্ট যোগ করতে চাও। তাহলে তুমি কী করবে? তুমি যা করতে পারঃ

#include <iostream>
#include <vector>
using namespace std;
int main() {
    vector<int> amarVector;
    vector<int>::iterator amarVectorErIterator;

    for (int i=1;i<=100;i++) amarVector.push_back(i);
    int sum = 0;
    for(amarVectorErIterator = amarVector.begin() + 20; amarVectorErIterator != amarVector.begin()+40; amarVectorErIterator++) {
        sum += *amarVectorErIterator;
        cout << *amarVectorErIterator << " ";
    }
    cout << endl << sum << endl;
    return 0;
}

এখানে যা হচ্ছে তা হল, amarVector.begin() + 20 লেখাতে শুরুতে amarVectorErIterator পয়েন্ট করছে ২১ তম উপাদানের দিকে। আবার শর্ত হিসেবে আমরা দিয়েছে ৪১ তম উপাদানকে যখন পয়েন্ট করবে ঠিক তখনই যেন লুপটা ভেঙ্গে যায়! আশা করেছি বুঝতে পেরেছ, না বুঝলে কমেন্ট সেকশন তো আছেই! 🙂

তবে সব কন্টেইনারের ক্ষেত্রে এভাবে +n দিয়ে ইনক্রিমেন্ট করা যায় না, যেমন সেট। এক্ষেত্রে শুধু ++ এবং — অপারেটরই হল ভরসা!

আজকের মত এখানেই শেষ। আগামী পর্বে আমরা একই সাথে জানবো সেট এবং ম্যাপ সম্পর্কে!

Muntasir Wahed

Muntasir Wahed

System Administrator at স্বশিক্ষা.com
Jack of all trades, master of none.
Muntasir Wahed
Muntasir Wahed