C++ তে ইটরেটর (Iterators) হলো একটি শক্তিশালী টুল যা কনটেইনারের উপাদানগুলোর মধ্যে চলাফেরা করার জন্য ব্যবহৃত হয়। ইটরেটর মূলত পয়েন্টারের মতো কাজ করে এবং এটি কনটেইনারের যে কোনো উপাদানে অ্যাক্সেস দিতে পারে। C++ স্ট্যান্ডার্ড লাইব্রেরি কনটেইনারের সাথে কাজ করতে ইটরেটর প্রদান করে, যা কোডের পোর্টেবিলিটি এবং কার্যকারিতা বাড়ায়।
ইটরেটরের সাহায্যে আপনি কনটেইনারের মধ্যে উপাদানগুলোর উপর বিভিন্ন অপারেশন (যেমন পড়া, লেখা, পরিবর্তন) করতে পারেন। ইটরেটরকে begin() এবং end() ফাংশনের মাধ্যমে কনটেইনারের প্রথম এবং শেষ উপাদানে নির্দেশনা দেওয়া হয়।
ইটরেটরের প্রকারভেদ
C++ এ বিভিন্ন ধরনের ইটরেটর রয়েছে, এবং প্রতিটি ইটরেটর ভিন্ন ভিন্ন কাজ করতে সক্ষম। এখানে কিছু সাধারণ ইটরেটর প্রকারের আলোচনা করা হলো:
১. Input Iterator:
Input Iteratorশুধুমাত্র ডেটা পড়ার জন্য ব্যবহৃত হয়। এটি একপথে পড়তে সক্ষম, অর্থাৎ একবার একটি উপাদান পড়ার পর তা পুনরায় অ্যাক্সেস করা যাবে না।
২. Output Iterator:
Output Iteratorশুধুমাত্র ডেটা লেখার জন্য ব্যবহৃত হয়। এটি ডেটা পড়তে সক্ষম নয়, তবে নতুন উপাদান যুক্ত করতে পারে।
৩. Forward Iterator:
Forward Iteratorএকপথে চলাফেরা করতে সক্ষম। এটি কনটেইনারের উপাদানগুলোর মধ্যে একের পর এক চলাফেরা করতে পারে।
৪. Bidirectional Iterator:
Bidirectional Iteratorএকপথে এবং উল্টো পথেও চলতে সক্ষম। এটি কনটেইনারের উপাদানগুলোকে উভয় দিক থেকে অ্যাক্সেস করতে পারে।
৫. Random Access Iterator:
Random Access Iteratorকনটেইনারের উপাদানগুলোকে এলোমেলোভাবে অ্যাক্সেস করতে সক্ষম, এবং এটি দ্রুত কাজ করতে পারে। এই ধরনের ইটরেটর অ্যারে বা ভেক্টরের মতো কনটেইনারের জন্য উপযোগী।
ইটরেটর ব্যবহার করার উদাহরণ
C++ এর স্ট্যান্ডার্ড লাইব্রেরি কনটেইনার যেমন vector, list, set, map ইত্যাদির সাথে কাজ করার জন্য ইটরেটর ব্যবহৃত হয়।
উদাহরণ ১: vector এর সাথে ইটরেটর ব্যবহার
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// ইটরেটর ব্যবহার করে ভেক্টরের উপাদানগুলো প্রদর্শন
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " "; // ইটরেটর থেকে মান পড়া
}
return 0;
}ব্যাখ্যা:
vec.begin()স্টার্টিং পয়েন্ট থেকে প্রথম উপাদানে নির্দেশ করে।vec.end()ফাংশনটি কনটেইনারের শেষের পরবর্তী পজিশনে নির্দেশ করে, যা একটি "ফলস পয়েন্টার" হিসেবে কাজ করে।*itব্যবহার করে ইটরেটরের মাধ্যমে উপাদান অ্যাক্সেস করা হয়।
উদাহরণ ২: list এর সাথে ইটরেটর ব্যবহার
#include <iostream>
#include <list>
int main() {
std::list<int> lst = {10, 20, 30, 40, 50};
// ইটরেটর ব্যবহার করে লিস্টের উপাদানগুলো প্রদর্শন
for (std::list<int>::iterator it = lst.begin(); it != lst.end(); ++it) {
std::cout << *it << " "; // ইটরেটর থেকে মান পড়া
}
return 0;
}ব্যাখ্যা:
std::listকনটেইনারে ইটরেটর ব্যবহারের সময় আমরাbegin()এবংend()ফাংশন ব্যবহার করি, যেগুলি প্রথম এবং শেষ উপাদানকে নির্দেশ করে।
ইটরেটরের অন্যান্য অপারেশন
ইটরেটর বিভিন্ন ধরণের অপারেশন সমর্থন করে, যেমন:
++it: ইটরেটরকে পরবর্তী উপাদানে নিয়ে যাওয়া।*it: ইটরেটরের দ্বারা নির্দেশিত উপাদান অ্যাক্সেস করা।it != vec.end(): ইটরেটরের মাধ্যমে কনটেইনারের শেষ পর্যন্ত পৌঁছানো না হওয়া পর্যন্ত চেক করা।
উদাহরণ ৩: reverse_iterator ব্যবহার
reverse_iterator একটি বিশেষ ধরনের ইটরেটর যা কনটেইনারের উপাদানগুলোকে উল্টো দিক থেকে অ্যাক্সেস করতে সক্ষম।
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// reverse_iterator ব্যবহার করে ভেক্টরের উপাদান উল্টো দিক থেকে প্রদর্শন
for (std::vector<int>::reverse_iterator rit = vec.rbegin(); rit != vec.rend(); ++rit) {
std::cout << *rit << " ";
}
return 0;
}ব্যাখ্যা:
rbegin()এবংrend()ইটরেটরগুলো রিভার্স অর্ডারে কনটেইনারের প্রথম এবং শেষ উপাদানে নির্দেশ করে।
ইটরেটর ব্যবহার করার সুবিধা
- গুরুত্বপূর্ণ কনটেইনারের জন্য সাধারণ ইন্টারফেস: C++ এর বিভিন্ন কনটেইনারের জন্য ইটরেটর ব্যবহৃত হতে পারে, যেমন
vector,list,set,map, যা প্রোগ্রামারদের জন্য একটি সাধারণ ইন্টারফেস প্রদান করে। - কমপাইলারের অপ্টিমাইজেশন: ইটরেটর ব্যবহারের মাধ্যমে কমপাইলার কনটেইনারগুলোর অপটিমাইজেশন সহজতর করতে পারে, যেমন
std::vectorঅথবাstd::listএর জন্য সঠিক স্ট্রাকচার নির্বাচন। - অ্যালগরিদমের সাথে সমন্বয়: ইটরেটরগুলিকে বিভিন্ন STL অ্যালগরিদমের সাথে একত্রে ব্যবহার করা যায়, যেমন
std::sort,std::find,std::reverseইত্যাদি।
উপসংহার
C++ তে ইটরেটর এমন একটি শক্তিশালী কনসেপ্ট যা কনটেইনারের মধ্যে চলাফেরা করার জন্য ব্যবহৃত হয়। এটি প্রোগ্রামারকে একটি সাধারণ এবং অ্যাবস্ট্র্যাক্ট উপায়ে কনটেইনারের উপাদানগুলো অ্যাক্সেস এবং পরিচালনা করতে সাহায্য করে। ইটরেটরের প্রকারভেদ, যেমন input iterator, output iterator, forward iterator, bidirectional iterator, এবং random access iterator, বিভিন্ন কনটেইনারের জন্য উপযুক্ত এবং উপকারী, যা C++ কোডকে আরও পড়তে সহজ এবং কার্যকরী করে তোলে।
Iterators C++ প্রোগ্রামিংয়ে একটি গুরুত্বপূর্ণ উপাদান, যা কনটেইনারের (যেমন vector, deque, list) উপাদানগুলোর মধ্য দিয়ে চলাফেরা করতে সাহায্য করে। এটি মূলত একটি পয়েন্টারের মতো কাজ করে, যা কনটেইনারের প্রতিটি উপাদানে একে একে অ্যাক্সেস করার জন্য ব্যবহৃত হয়। ইটরেটর ব্যবহার করে প্রোগ্রামাররা কনটেইনারের উপাদানগুলোকে সহজে এবং কার্যকরীভাবে অ্যাক্সেস, পরিবর্তন, এবং প্রক্রিয়াকরণ করতে পারে।
ইটরেটরসের মৌলিক ধারণা
- ইটরেটর হল একটি অবজেক্ট যা কনটেইনারের প্রতিটি উপাদানের অবস্থান নির্দেশ করে।
- ইটরেটর সাধারণত
begin()এবংend()ফাংশনের মাধ্যমে কনটেইনারের শুরু এবং শেষ নির্ধারণ করে। - ইটরেটরকে
++এবং--অপারেটরের মাধ্যমে পরবর্তী বা পূর্ববর্তী উপাদানে নিয়ে যাওয়া যায়। - এটি একটি পয়েন্টারের মতো কাজ করে, তাই কনটেইনারের উপাদানগুলোর সাথে সরাসরি কাজ করতে দেয়।
ইটরেটরসের ধরনসমূহ
C++ এ বিভিন্ন প্রকারের ইটরেটর রয়েছে, প্রতিটির নিজস্ব ব্যবহার ও বৈশিষ্ট্য রয়েছে:
- Input Iterator: কনটেইনার থেকে একবার পড়ার জন্য ব্যবহৃত হয়। সাধারণত যখন কনটেইনার থেকে শুধু পড়ার প্রয়োজন হয় তখন ব্যবহার করা হয়।
- Output Iterator: কনটেইনারে একবার লেখার জন্য ব্যবহৃত হয়। সাধারণত শুধুমাত্র লেখার জন্য এবং পরবর্তী উপাদানে যাওয়ার জন্য ব্যবহৃত হয়।
- Forward Iterator: কনটেইনারের উপাদানগুলোর উপর সামনের দিকে একবার ট্রাভার্স করার জন্য ব্যবহৃত হয়। এটি Input এবং Output ইটরেটর উভয়ের মতো কাজ করতে পারে।
- Bidirectional Iterator: কনটেইনারের উপাদানগুলোর উপর সামনের দিকে এবং পিছনের দিকে উভয় দিকেই চলাফেরা করতে পারে।
- Random Access Iterator: এলোমেলোভাবে (randomly) কনটেইনারের যেকোনো উপাদানে অ্যাক্সেস করার সুবিধা দেয়। এটি অ্যারে বা ভেক্টরের জন্য খুবই কার্যকর।
ইটরেটর ব্যবহার
ইটরেটর ব্যবহার করার জন্য সাধারণত কনটেইনারের begin() এবং end() ফাংশন ব্যবহার করা হয়। begin() ফাংশন কনটেইনারের প্রথম উপাদানের অবস্থান নির্দেশ করে এবং end() ফাংশনটি শেষের পরের অবস্থান নির্দেশ করে।
উদাহরণ ১: std::vector এর সাথে ইটরেটর ব্যবহার
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {10, 20, 30, 40, 50};
// ভেক্টরের শুরু থেকে শেষ পর্যন্ত ইটরেটর ব্যবহার করে ট্রাভার্স করা
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " "; // ইটরেটর ডেরেফারেন্স করে মান প্রিন্ট করা
}
return 0;
}আউটপুট:
10 20 30 40 50উদাহরণ ২: std::list এর সাথে Bidirectional Iterator ব্যবহার
#include <iostream>
#include <list>
int main() {
std::list<int> lst = {1, 2, 3, 4, 5};
// লিস্টের শুরু থেকে শেষ পর্যন্ত ইটরেটর ব্যবহার করে ট্রাভার্স করা
for (std::list<int>::iterator it = lst.begin(); it != lst.end(); ++it) {
std::cout << *it << " ";
}
return 0;
}উদাহরণ ৩: std::vector এর সাথে Random Access Iterator ব্যবহার
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// Random Access ইটরেটর দিয়ে যেকোনো উপাদানে অ্যাক্সেস
std::cout << "Third element: " << vec[2] << std::endl; // আউটপুট: 3
std::cout << "Fifth element: " << vec[4] << std::endl; // আউটপুট: 5
return 0;
}সাধারণ ইটরেটর অপারেশন
ইটরেটর ব্যবহার করে কিছু সাধারণ অপারেশন করা যায়:
- ডেরেফারেন্স করা:
*itএর মাধ্যমে ইটরেটরের নির্দেশিত মান পাওয়া যায়। - ইনক্রিমেন্ট করা:
++itদ্বারা পরবর্তী উপাদানে যাওয়া যায়। - ডিক্রিমেন্ট করা:
--itদ্বারা পূর্ববর্তী উপাদানে যাওয়া যায় (Bidirectional Iterator বা Random Access Iterator এর জন্য)। - এলোমেলো অ্যাক্সেস:
it + n,it - n(শুধুমাত্র Random Access Iterator এর জন্য)।
ইটরেটরের ব্যবহারিক দিক
- কনটেইনারের উপর ইটারেট করা: ইটরেটর ব্যবহার করে কনটেইনারের প্রতিটি উপাদানের উপর লুপ চালানো যায়।
- ডেটা অ্যাক্সেস এবং পরিবর্তন: ইটরেটর ব্যবহার করে কনটেইনারের ডেটা পড়া বা লেখা সহজ হয়।
- কনটেইনার-স্বাধীন কোডিং: ইটরেটর ব্যবহার করলে একই কোড বিভিন্ন কনটেইনারের জন্য ব্যবহার করা যায়, কারণ সব কনটেইনারেই ইটরেটর থাকে।
উপসংহার
ইটরেটর C++ প্রোগ্রামিংয়ে কনটেইনারের উপাদানগুলোর উপর সহজে ট্রাভার্স এবং ম্যানিপুলেশন করার একটি কার্যকরী পদ্ধতি। এটি কনটেইনারের প্রকারভেদ নির্বিশেষে উপাদান অ্যাক্সেসের একটি সাধারণ এবং নমনীয় উপায় সরবরাহ করে।
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: যেকোনো উপাদান অ্যাক্সেস করতে সক্ষম এবং দ্রুততম ভ্রমণ প্রদান করে।
প্রতিটি ইটরেটর তার নিজস্ব ব্যবহারের ক্ষেত্রে উপযুক্ত এবং সঠিক ইটরেটর নির্বাচন প্রোগ্রামের কার্যকারিতা ও দক্ষতা বৃদ্ধি করতে সাহায্য করে।
C++-এ ইটরেটর ফাংশন (Iterator Functions) হল এমন ফাংশনগুলি যা কনটেইনারের মধ্যে উপাদানগুলোর ওপর ভ্রমণ করতে সাহায্য করে। ইটরেটরগুলি std::vector, std::list, std::set, std::map সহ বিভিন্ন কনটেইনারের উপাদান অ্যাক্সেস করতে ব্যবহৃত হয়। begin(), end(), rbegin(), এবং rend() হলো ইটরেটরের জন্য কিছু গুরুত্বপূর্ণ ফাংশন যা C++-এ কনটেইনারের উপাদানগুলির মধ্যে ট্রাভার্স করতে ব্যবহৃত হয়।
১. begin() (প্রথম উপাদানে পয়েন্টার)
begin() ফাংশন কনটেইনারের প্রথম উপাদানটি নির্দেশ করে। এটি একটি ইটরেটর রিটার্ন করে যা কনটেইনারের প্রথম উপাদানে পয়েন্ট করে।
ব্যবহার:
begin()ফাংশন কনটেইনারের প্রথম উপাদানের আগে থেকে ট্রাভার্স শুরু করতে ব্যবহৃত হয়।
উদাহরণ:
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {10, 20, 30, 40, 50};
// begin() ব্যবহার করে প্রথম উপাদান প্রিন্ট করা
std::cout << "First element: " << *numbers.begin() << std::endl;
return 0;
}আউটপুট:
First element: 10২. end() (শেষ উপাদানের পরবর্তী পয়েন্টার)
end() ফাংশন কনটেইনারের শেষ উপাদানের পরবর্তী স্থানে একটি ইটরেটর রিটার্ন করে। এটি একটি নির্দিষ্ট মানের পয়েন্টার নয়, বরং কনটেইনারের শেষের পরবর্তী স্থানের একটি অবস্থান নির্দেশ করে। এই ইটরেটরের মান কোনো উপাদানকে নির্দেশ করে না এবং এটি কনটেইনারের শেষের বাইরে।
ব্যবহার:
end()ফাংশন সাধারণত লুপে কনটেইনারের উপাদানগুলির মধ্য দিয়ে ট্রাভার্স করতে ব্যবহৃত হয়।
উদাহরণ:
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {10, 20, 30, 40, 50};
// end() ব্যবহার করে সব উপাদান প্রিন্ট করা
for (auto it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
return 0;
}আউটপুট:
10 20 30 40 50৩. rbegin() (পিছনে থেকে প্রথম উপাদানে পয়েন্টার)
rbegin() ফাংশন কনটেইনারের শেষ উপাদান থেকে শুরু করে প্রথম উপাদানে পয়েন্ট করে। এটি একটি রিভার্স ইটরেটর রিটার্ন করে, যা কনটেইনারের উপাদানগুলো উল্টো দিক থেকে ট্রাভার্স করতে ব্যবহৃত হয়।
ব্যবহার:
rbegin()ফাংশন কনটেইনারের উপাদানগুলো উল্টো (পিছন থেকে সামনে) ক্রমে অ্যাক্সেস করতে ব্যবহৃত হয়।
উদাহরণ:
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {10, 20, 30, 40, 50};
// rbegin() ব্যবহার করে উল্টো দিক থেকে উপাদান প্রিন্ট করা
for (auto it = numbers.rbegin(); it != numbers.rend(); ++it) {
std::cout << *it << " ";
}
return 0;
}আউটপুট:
50 40 30 20 10৪. rend() (রিভার্স শেষে পয়েন্টার)
rend() ফাংশন কনটেইনারের রিভার্স শেষের পরবর্তী স্থানে একটি ইটরেটর রিটার্ন করে। এটি rbegin() এর মতো কাজ করে, তবে এটি শেষ উপাদান থেকে এক স্থান পরবর্তী অবস্থান নির্দেশ করে।
ব্যবহার:
rend()ফাংশন রিভার্স ট্রাভার্সে শেষ অবস্থানকে চিহ্নিত করে, যেখানে ট্রাভার্স শেষ হয়।
উদাহরণ:
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {10, 20, 30, 40, 50};
// rbegin() ও rend() ব্যবহার করে উল্টো দিক থেকে উপাদান প্রিন্ট করা
for (auto it = numbers.rbegin(); it != numbers.rend(); ++it) {
std::cout << *it << " ";
}
return 0;
}আউটপুট:
50 40 30 20 10ইটরেটর ফাংশন গুলির সংক্ষিপ্ত বিবরণ:
| ফাংশন | বর্ণনা |
|---|---|
begin() | কনটেইনারের প্রথম উপাদানে একটি ইটরেটর রিটার্ন করে। |
end() | কনটেইনারের শেষ উপাদানের পরবর্তী স্থানে একটি ইটরেটর রিটার্ন করে। |
rbegin() | কনটেইনারের শেষ উপাদানে শুরু হওয়া রিভার্স ইটরেটর রিটার্ন করে। |
rend() | কনটেইনারের প্রথম উপাদানের পরবর্তী স্থানে রিভার্স ইটরেটর রিটার্ন করে। |
উপসংহার
begin()এবংend()ফাংশনগুলি কনটেইনারের উপাদানগুলোর মধ্যে ফরওয়ার্ড ট্রাভার্স (সামনে থেকে পিছনে) করতে ব্যবহৃত হয়।rbegin()এবংrend()ফাংশনগুলি কনটেইনারের উপাদানগুলোর মধ্যে রিভার্স ট্রাভার্স (পিছনে থেকে সামনে) করতে ব্যবহৃত হয়।- এই ফাংশনগুলি ইটরেটরের সাথে ব্যবহার করা হয়, যা কনটেইনারের উপাদানগুলোতে কার্যকরীভাবে চলাচল করতে সহায়ক।
সি++ এ ইটেরেটর ফাংশনগুলো (begin(), end(), rbegin(), rend()) বিভিন্ন কনটেইনারের উপাদানগুলোর উপর কাজ করতে এবং এগুলোর মধ্যে ট্রাভার্স করতে ব্যবহার করা হয়। এগুলোর মাধ্যমে প্রোগ্রামাররা সহজেই কনটেইনারের শুরু ও শেষ পয়েন্টে কাজ করতে পারে এবং এগুলোর জন্য বিভিন্ন প্রকারের লুপ ও অ্যালগরিদম ব্যবহার করতে পারে।
১. begin() ফাংশন
begin() ফাংশনটি কনটেইনারের প্রথম ইলিমেন্টের একটি ইটেরেটর রিটার্ন করে। এটি মূলত কনটেইনারের শুরু থেকে উপাদানগুলোতে অ্যাক্সেস করতে সাহায্য করে।
উদাহরণ:
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
// `begin()` ফাংশন ব্যবহার করে প্রথম ইলিমেন্ট থেকে লুপ চালানো
for (auto it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
return 0;
}উপরে, begin() ভেক্টরের প্রথম উপাদানটি নির্দেশ করে এবং এটি দিয়ে কনটেইনারের উপর লুপ চালানো যায়।
২. end() ফাংশন
end() ফাংশনটি কনটেইনারের শেষ ইলিমেন্টের ঠিক পরের পজিশনের একটি ইটেরেটর রিটার্ন করে। এটি সাধারণত লুপের শেষ সীমা নির্ধারণের জন্য ব্যবহৃত হয়।
উদাহরণ:
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
for (auto it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
return 0;
}উপরে end() ইটেরেটরটি শেষ উপাদানের ঠিক পরের পজিশন নির্দেশ করে, তাই এটি লুপে != এর মাধ্যমে শেষ সীমা হিসেবে ব্যবহৃত হয়।
৩. rbegin() ফাংশন
rbegin() ফাংশনটি কনটেইনারের শেষ ইলিমেন্টের একটি রিভার্স ইটেরেটর রিটার্ন করে, যা শেষ থেকে শুরু করে প্রথম ইলিমেন্ট পর্যন্ত লুপ চালানোর জন্য ব্যবহৃত হয়।
উদাহরণ:
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
// `rbegin()` এবং `rend()` ব্যবহার করে রিভার্স লুপ চালানো
for (auto it = numbers.rbegin(); it != numbers.rend(); ++it) {
std::cout << *it << " ";
}
return 0;
}এখানে rbegin() শেষ উপাদান নির্দেশ করে এবং রিভার্স লুপে ব্যবহৃত হয় যা প্রথম ইলিমেন্ট পর্যন্ত যায়।
৪. rend() ফাংশন
rend() ফাংশনটি কনটেইনারের প্রথম ইলিমেন্টের ঠিক পূর্বের একটি রিভার্স ইটেরেটর রিটার্ন করে, যা রিভার্স লুপের শেষ সীমা হিসেবে ব্যবহৃত হয়।
উদাহরণ:
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
for (auto it = numbers.rbegin(); it != numbers.rend(); ++it) {
std::cout << *it << " ";
}
return 0;
}এখানে rend() ইটেরেটরটি কনটেইনারের শুরুর ঠিক পূর্ববর্তী অবস্থান নির্দেশ করে এবং রিভার্স লুপের শেষ সীমা হিসেবে ব্যবহৃত হয়।
সংক্ষেপে
begin(): কনটেইনারের প্রথম উপাদানের ইটেরেটর রিটার্ন করে।end(): শেষ উপাদানের পরবর্তী পজিশনের ইটেরেটর রিটার্ন করে।rbegin(): শেষ উপাদানের রিভার্স ইটেরেটর রিটার্ন করে, যা রিভার্স লুপের জন্য ব্যবহৃত হয়।rend(): প্রথম উপাদানের পূর্ববর্তী পজিশনের রিভার্স ইটেরেটর রিটার্ন করে।
এই ইটেরেটর ফাংশনগুলো কনটেইনারের মধ্যে উপাদানগুলোতে সহজেই প্রবেশাধিকার দেয় এবং এগুলোর মধ্যে লুপ চালানো বা অ্যালগরিদম প্রয়োগ করতে সহায়ক হয়।
Read more