ইটারেটর (Iterator) হলো C++ স্ট্যান্ডার্ড টেমপ্লেট লাইব্রেরি (STL) এর একটি উপাদান, যা কনটেইনারের উপাদানগুলোতে ধারাবাহিকভাবে অ্যাক্সেস করতে ব্যবহৃত হয়। ইটারেটরকে এক প্রকার "পয়েন্টার" বলা যেতে পারে, যা কনটেইনারের প্রতিটি উপাদানের ঠিকানাকে নির্দেশ করে এবং উপাদানগুলোতে লুপ চালাতে সাহায্য করে।
ইটারেটরের প্রকারভেদ
STL এ বিভিন্ন প্রকারের ইটারেটর রয়েছে, যেগুলো বিভিন্ন ধরনের কনটেইনারের উপাদানগুলোতে বিভিন্নভাবে অ্যাক্সেস করতে ব্যবহৃত হয়:
- Input Iterator: কনটেইনারের একবারে একটির বেশি উপাদান রিড করতে পারে না। সাধারণত এক দিকে (সামনে) এগিয়ে যায়।
- Output Iterator: কনটেইনারে একবারে একটির বেশি উপাদান লেখার জন্য ব্যবহৃত হয়।
- Forward Iterator: সামনে এগিয়ে যেতে পারে এবং একাধিকবার রিড ও রাইট করতে পারে।
- Bidirectional Iterator: সামনের পাশাপাশি পিছনেও যেতে পারে, যা
list,set,mapএর জন্য ব্যবহৃত হয়। - Random Access Iterator: সরাসরি যেকোনো ইনডেক্সে যেতে পারে, যা
vector,deque,arrayএর জন্য ব্যবহৃত হয়।
উদাহরণ: ইটারেটর ব্যবহার করে vector কনটেইনারের উপাদান অ্যাক্সেস করা
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> numbers = {10, 20, 30, 40, 50};
// ইটারেটর ঘোষণা করা
vector<int>::iterator it;
// ইটারেটর ব্যবহার করে উপাদান প্রিন্ট করা
for (it = numbers.begin(); it != numbers.end(); ++it) {
cout << *it << " ";
}
return 0;
}
বর্ণনা:
- এখানে
vector<int>::iteratorব্যবহার করেitনামে একটি ইটারেটর তৈরি করা হয়েছে, যাnumbersভেক্টরের প্রতিটি উপাদানে লুপ চালাতে সাহায্য করে। *itদ্বারা প্রতিটি উপাদানের মান অ্যাক্সেস করা হয়েছে।
আউটপুট:
10 20 30 40 50
ইটারেটরের মাধ্যমে কনটেইনারে লেখা
ইটারেটর ব্যবহার করে শুধু কনটেইনারের উপাদান পড়া নয়, উপাদানে মান লিখাও সম্ভব। নিচে একটি উদাহরণ দেওয়া হলো।
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> numbers = {10, 20, 30, 40, 50};
// প্রতিটি উপাদান দ্বিগুণ করা
for (auto it = numbers.begin(); it != numbers.end(); ++it) {
*it *= 2;
}
// পরিবর্তিত মান প্রিন্ট করা
for (int num : numbers) {
cout << num << " ";
}
return 0;
}
আউটপুট:
20 40 60 80 100
বর্ণনা:
- এখানে
itইটারেটর ব্যবহার করে প্রতিটি উপাদানের মান দ্বিগুণ করা হয়েছে এবং পরিবর্তিত ভেক্টরের মান প্রিন্ট করা হয়েছে।
ইটারেটরের গুরুত্বপূর্ণ অপারেশনসমূহ
- begin(): কনটেইনারের প্রথম উপাদানের দিকে ইটারেটর নির্দেশ করে।
- end(): কনটেইনারের শেষ উপাদানের ঠিক পরের অবস্থানের দিকে ইটারেটর নির্দেশ করে।
- *** (dereference operator)**: ইটারেটরের নির্দেশিত উপাদানের মান অ্যাক্সেস করতে ব্যবহৃত।
- ++it বা it++: ইটারেটরকে পরবর্তী উপাদানের দিকে সরায়।
- --it বা it--: ইটারেটরকে পূর্ববর্তী উপাদানের দিকে সরায় (bidirectional এবং random access ইটারেটরের জন্য)।
- it + n: ইটারেটরকে n ধাপ এগিয়ে নিয়ে যায় (random access ইটারেটরের জন্য)।
- it - n: ইটারেটরকে n ধাপ পিছিয়ে নিয়ে যায় (random access ইটারেটরের জন্য)।
উদাহরণ: bidirectional এবং random access iterator ব্যবহার
#include <iostream>
#include <list>
#include <vector>
using namespace std;
int main() {
list<int> numList = {10, 20, 30, 40, 50};
vector<int> numVector = {5, 15, 25, 35, 45};
// bidirectional iterator - list এর জন্য
auto itList = numList.begin();
++itList;
cout << "Second element in list: " << *itList << endl;
// random access iterator - vector এর জন্য
auto itVector = numVector.begin();
itVector += 2; // তৃতীয় উপাদানে সরানো
cout << "Third element in vector: " << *itVector << endl;
return 0;
}
আউটপুট:
Second element in list: 20
Third element in vector: 25
বর্ণনা:
- এখানে
listএবংvectorকনটেইনারের জন্য যথাক্রমে bidirectional এবং random access ইটারেটর ব্যবহার করা হয়েছে। numListএ++itListব্যবহার করে দ্বিতীয় উপাদানে পৌঁছানো হয়েছে এবংnumVectorএitVector += 2ব্যবহার করে তৃতীয় উপাদানে পৌঁছানো হয়েছে।
ইটারেটরের সুবিধা
- ইউনিভার্সাল অ্যাক্সেস: ইটারেটরের মাধ্যমে যেকোনো কনটেইনারের উপাদানে অ্যাক্সেস করা যায়।
- কনটেইনার ইন্ডিপেন্ডেন্ট: ইটারেটরের সাহায্যে কোড লেখা হয় কনটেইনারের ধরন সম্পর্কে চিন্তা না করে।
- নমনীয়তা: ইটারেটর ব্যবহার করে সহজেই কনটেইনারে উপাদান যোগ, মুছা, এবং পরিবর্তন করা যায়।
সারসংক্ষেপ
- ইটারেটর হলো কনটেইনারের উপাদানগুলিতে ধারাবাহিকভাবে অ্যাক্সেস করার একটি উপায়।
- এটি
begin()এবংend()এর মাধ্যমে কনটেইনারের শুরু এবং শেষ চিহ্নিত করে। - ইটারেটর ব্যবহার করে STL এর যেকোনো কনটেইনারের উপাদান অ্যাক্সেস, মডিফাই, এবং অপারেশন পরিচালনা করা সহজ হয়।
C++ এ ইটারেটর প্রোগ্রামিংকে আরো সহজ ও কার্যকর করে তোলে এবং কনটেইনারের উপাদানগুলির উপর নির্ভরশীল অপারেশনগুলোতে সুবিধা প্রদান করে।