C++ স্ট্যান্ডার্ড লাইব্রেরি বিভিন্ন ধরণের ইটরেটর (Iterators) সরবরাহ করে, যা কনটেইনারের উপাদানগুলোতে অ্যাক্সেস করতে ব্যবহৃত হয়। ইটরেটরগুলো পয়েন্টারের মতো কাজ করে এবং কনটেইনারের উপাদানগুলোর মধ্য দিয়ে চলাচল করতে সাহায্য করে। এগুলোর মধ্যে প্রধান পার্থক্য হল এগুলোর অ্যাক্সেসের ক্ষমতা এবং যেখানে ব্যবহার করা যায়। সেগুলোর মধ্যে Input Iterators, Output Iterators, Forward Iterators, Bidirectional Iterators, এবং Random Access Iterators অন্তর্ভুক্ত।
এখানে এই ইটরেটরগুলো বিস্তারিতভাবে আলোচনা করা হলো:
১. Input Iterator
Input Iterator হল এমন একটি ইটরেটর যা শুধুমাত্র কনটেইনারের উপাদানগুলোকে পড়তে পারে। এটি একপথে, শুধুমাত্র একবার ভ্রমণ করতে সক্ষম, অর্থাৎ আপনি ইটরেটরের মাধ্যমে কেবল একটি উপাদান পড়তে পারবেন এবং পুনরায় সেই উপাদানটি অ্যাক্সেস করতে পারবেন না। এটি ডেটা পড়া বা ইনপুট স্ট্রিমে ব্যবহৃত হয়।
- ক্ষমতা: শুধু পড়তে পারে (read-only)।
- গতি: একপথে অ্যাক্সেস (single pass)।
উদাহরণ:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// Input iterator ব্যবহার করে উপাদানগুলো পড়া
std::vector<int>::iterator it = vec.begin();
std::cout << *it << std::endl; // 1
return 0;
}এখানে, it কেবলমাত্র একটি উপাদান পড়তে সক্ষম।
২. Output Iterator
Output Iterator হল এমন একটি ইটরেটর যা কেবল কনটেইনারের উপাদানগুলোতে লেখা (write) করতে পারে, কিন্তু এটি পড়তে সক্ষম নয়। এই ইটরেটরের মাধ্যমে আপনি কেবল ডেটা লিখতে পারবেন।
- ক্ষমতা: শুধুমাত্র লিখতে পারে (write-only)।
- গতি: একপথে অ্যাক্সেস (single pass)।
উদাহরণ:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec(5);
// Output iterator ব্যবহার করে মান লিখা
std::vector<int>::iterator it = vec.begin();
*it = 10; // প্রথম উপাদানে মান ১০ লিখা
std::cout << vec[0] << std::endl; // আউটপুট হবে 10
return 0;
}এখানে, it কেবল একটি উপাদান লিখতে সক্ষম।
৩. Forward Iterator
Forward Iterator হল এমন একটি ইটরেটর যা কনটেইনারের উপাদানগুলোকে একপথে ভ্রমণ করতে পারে এবং উপাদানগুলোর মান পরিবর্তন করতে বা পড়তে সক্ষম। এটি একাধিক বার চলতে পারে, কিন্তু শুধুমাত্র একপথে। এই ইটরেটরটি সাধারনত লিংকড লিস্ট এবং অন্যান্য ধারাবাহিক কনটেইনারের জন্য ব্যবহৃত হয়।
- ক্ষমতা: একপথে একাধিক বার চলাফেরা করতে পারে (single-directional) এবং উপাদান পড়তে বা পরিবর্তন করতে সক্ষম।
- গতি: একপথে একাধিক বার চলাচল করতে পারে।
উদাহরণ:
#include <iostream>
#include <list>
int main() {
std::list<int> lst = {1, 2, 3, 4, 5};
// Forward iterator ব্যবহার করে উপাদানগুলো প্রিন্ট করা
for (std::list<int>::iterator it = lst.begin(); it != lst.end(); ++it) {
std::cout << *it << " ";
}
return 0;
}এখানে, it উপাদানগুলো একপথে একাধিক বার পড়তে সক্ষম।
৪. Bidirectional Iterator
Bidirectional Iterator হল এমন একটি ইটরেটর যা কনটেইনারের উপাদানগুলোকে দুই দিক (Forward এবং Backward) ভ্রমণ করতে সক্ষম। এটি সাধারণত ডাবল লিঙ্কড লিস্টের জন্য ব্যবহার করা হয়, কারণ ডাবল লিঙ্কড লিস্টে পূর্ববর্তী এবং পরবর্তী উপাদানগুলোতে প্রবেশ করা যায়।
- ক্ষমতা: একপথে এবং বিপরীত দিকে চলাচল করতে পারে (two-way traversal)।
- গতি: দুই দিক থেকে চলাচল।
উদাহরণ:
#include <iostream>
#include <list>
int main() {
std::list<int> lst = {1, 2, 3, 4, 5};
// Bidirectional iterator ব্যবহার করে উপাদানগুলো প্রিন্ট করা
std::list<int>::iterator it = lst.begin();
std::cout << *it << " "; // প্রথম উপাদান
++it;
std::cout << *it << " "; // দ্বিতীয় উপাদান
--it;
std::cout << *it << std::endl; // প্রথম উপাদান
return 0;
}এখানে, it ইটরেটরটি প্রথমে সামনে, তারপর পিছনে চলাচল করছে।
৫. Random Access Iterator
Random Access Iterator হল সবচেয়ে শক্তিশালী ইটরেটর, যা কনটেইনারের উপাদানগুলোর মধ্যে যেকোনো অবস্থানে যেতে সক্ষম। এটি কনটেইনারের উপাদানগুলোর প্রতি এলোমেলো অ্যাক্সেস প্রদান করে এবং দ্রুততম ভ্রমণ (constant time) নিশ্চিত করে। এটি সাধারণত অ্যারে বা ভেক্টর কনটেইনারের জন্য ব্যবহৃত হয়।
- ক্ষমতা: এলোমেলোভাবে, দ্রুত এবং একাধিক দিক থেকে চলাচল করতে সক্ষম (random access)।
- গতি: দ্রুততম (constant time access)।
উদাহরণ:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {10, 20, 30, 40, 50};
// Random Access Iterator ব্যবহার করে উপাদানগুলোর অ্যাক্সেস
std::vector<int>::iterator it = vec.begin();
std::cout << *(it + 2) << std::endl; // 30 (যেকোনো অবস্থানে অ্যাক্সেস)
return 0;
}এখানে, it + 2 দ্বারা এলোমেলোভাবে তৃতীয় উপাদান (30) অ্যাক্সেস করা হয়েছে, যা Random Access Iterator এর ক্ষমতা।
পার্থক্য সারণী
| Iterator Type | Access Type | Movement Direction | Time Complexity |
|---|---|---|---|
| Input Iterator | Read-only | One-way, single pass | O(1) |
| Output Iterator | Write-only | One-way, single pass | O(1) |
| Forward Iterator | Read/Write | One-way, multiple passes | O(1) |
| Bidirectional Iterator | Read/Write | Two-way (forward & backward) | O(1) |
| Random Access Iterator | Read/Write | Random access, two-way | O(1) |
উপসংহার
- Input Iterator: কেবলমাত্র ডেটা পড়তে সক্ষম এবং একপথে চলাচল করতে পারে।
- Output Iterator: কেবলমাত্র ডেটা লিখতে সক্ষম এবং একপথে চলাচল করতে পারে।
- Forward Iterator: একপথে চলাচল এবং উপাদান পড়া বা লিখতে সক্ষম।
- Bidirectional Iterator: দুই দিক থেকে চলাচল করতে সক্ষম (ফরওয়ার্ড ও ব্যাকওয়ার্ড)।
- Random Access Iterator: যেকোনো উপাদান অ্যাক্সেস করতে সক্ষম এবং দ্রুততম ভ্রমণ প্রদান করে।
প্রতিটি ইটরেটর তার নিজস্ব ব্যবহারের ক্ষেত্রে উপযুক্ত এবং সঠিক ইটরেটর নির্বাচন প্রোগ্রামের কার্যকারিতা ও দক্ষতা বৃদ্ধি করতে সাহায্য করে।
Read more