যে ইটেরেটরগুলো একটি রেঞ্জের উপাদান সিকোয়েন্সকে উভয় দিক থেকে - অর্থাৎ শেষ থেকে এবং শুরু থেকে - অ্যাক্সেস করার সুবিধা পায়, তাদেরকে বিডিরেকশনাল ইটেরেটর বলা হয়। ইটেরেটর লিস্ট, ম্যাপ এবং সেটের মতো ডেটা টাইপের ওপর কাজ করতে পারে।
বিডিরেকশনাল ইটেরেটর-দের ফরওয়ার্ড ইটেরেটর-দের মতো একই প্রোপার্টি রয়েছে, একমাত্র পার্থক্য হলো এগুলো ডিক্রিমেন্টও করা যায়:
| প্রোপার্টি | বৈধ এক্সপ্রেশন |
|---|---|
| ডিফল্ট-কনস্ট্রাক্টিবল, কপি-কনস্ট্রাক্টিবল, কপি-অ্যাসাইনেবল এবং ডিস্ট্রাক্টিবল |
X a; X b(a); b = a; |
| ইকোয়ারিটি/ইনইকোয়ারিটি অপারেটর ব্যবহার করে সমতুল্যতার জন্য তুলনা করা যায় (মেনিংফুল যখন উভয় ইটেরেটর ভ্যালু একই আন্ডারলাইন সিকোয়েন্সের ওপর ইটারেট করে)। | a == b a != b |
| এক rvalue হিসেবে ডিরেফারেন্স করা যায় (যদি ডিরেফারেন্সেবল স্টেটে থাকে)। | *a a->m |
| মিউটেবল ইটেরেটর (নন-কনস্ট্যান্ট ইটেরেটর) জন্য: একটি lvalue হিসেবে ডিরেফারেন্স করা যায় (যদি ডিরেফারেন্সেবল স্টেটে থাকে)। | *a = t |
| ইনক্রিমেন্ট করা যায় (যদি ডিরেফারেন্সেবল স্টেটে থাকে)। ফলাফল হয় ডিরেফারেন্সেবল অথবা প্যাশ-দ-এন্ড ইটেরেটর। দুটি ইটেরেটর যা সমান বলা হয়, উভয়ই ইনক্রিমেন্ট হওয়ার পরেও সমান থাকে। | ++a a++ *a++ |
| ডিক্রিমেন্ট করা যায় (যদি একটি ডিরেফারেন্সেবল ইটেরেটর ভ্যালু এটিকে প্রসিড করে)। | --a a-- *a-- |
| Lvalues সোয়াপযোগ্য। | swap(a,b) |
যেখানে X একটি বিডিরেকশনাল ইটেরেটর, a এবং b এই ইটেরেটর টাইপের অবজেক্ট, এবং t হলো ইটেরেটর টাইপ দ্বারা পয়েন্ট করা টাইপের অবজেক্ট (অথবা অন্য কোনো টাইপ যা টাইপ X এর অবজেক্ট ডিরেফারেন্স করার মাধ্যমে ফেরত দেওয়া lvalue-এ অ্যাসাইন করা যায়)।
C++-এ বিডিরেকশনাল ইটেরেটরের কনসেপ্ট।
বিডিরেকশনাল ইটেরেটর ফরওয়ার্ড ইটেরেটরের সব বৈশিষ্ট্য সাপোর্ট করে, এবং প্রিফিক্স ও পোস্টফিক্স ডিক্রিমেন্ট অপারেটরও।
এই ধরনের ইটেরেটর উভয় দিক থেকে উপাদান অ্যাক্সেস করতে পারে, যেমন শেষের দিকে এবং শুরুতে।
র্যান্ডম অ্যাক্সেস ইটেরেটরও বিডিরেকশনাল ইটেরেটরের একটি টাইপ।
বিডিরেকশনাল ইটেরেটর ফরওয়ার্ড ইটেরেটরের বৈশিষ্ট্য রয়েছে, কিন্তু একমাত্র পার্থক্য হলো এই ইটেরেটর ডিক্রিমেন্টও করা যায়।
ইনপুট: 1 2 3 4 5 6 7 8 9 10 আউটপুট: 10 9 8 7 6 5 4 3 2 1
উদাহরণ
#include <iostream>
#include<iterator>
#include<vector>
using namespace std;
int main() {
vector<int> vec{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
vector<int> ::iterator it;
vector<int> :: reverse_iterator rev_it;
for(it = vec.begin(); it != vec.end(); it++)
cout << *it << " ";
cout << endl;
for(rev_it = vec.rbegin(); rev_it != vec.rend(); rev_it++)
cout << *rev_it << " ";
}
আউটপুট
1 2 3 4 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 1