কম্পিউটার টিউটোরিয়াল

C++ বিডিরেকশনাল ইটেরেটর (Bidirectional Iterators)


যে ইটেরেটরগুলো একটি রেঞ্জের উপাদান সিকোয়েন্সকে উভয় দিক থেকে - অর্থাৎ শেষ থেকে এবং শুরু থেকে - অ্যাক্সেস করার সুবিধা পায়, তাদেরকে বিডিরেকশনাল ইটেরেটর বলা হয়। ইটেরেটর লিস্ট, ম্যাপ এবং সেটের মতো ডেটা টাইপের ওপর কাজ করতে পারে।

বিডিরেকশনাল ইটেরেটর-দের ফরওয়ার্ড ইটেরেটর-দের মতো একই প্রোপার্টি রয়েছে, একমাত্র পার্থক্য হলো এগুলো ডিক্রিমেন্টও করা যায়:

প্রোপার্টি বৈধ এক্সপ্রেশন
ডিফল্ট-কনস্ট্রাক্টিবল,
কপি-কনস্ট্রাক্টিবল,
কপি-অ্যাসাইনেবল এবং ডিস্ট্রাক্টিবল
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

  1. C++-এ বাইনারি সার্চ ট্রি ইটারেটর (Binary Search Tree Iterator)

  2. C++-এ আউটপুট ইটেরেটর (Output Iterators)

  3. C++-এ ইটেরেটর ইনভ্যালিডেশন (Iterator Invalidation)

  4. C#-এ ইটেরেটর (Iterators)