बाइडायरेक्शनल इटरेटर्स क्या हैं?
वे इटरेटर्स जो रेंज के तत्वों के क्रम को दोनों दिशाओं से एक्सेस करने का अधिकार रखते हैं - अंत से और शुरुआत से - बाइडायरेक्शनल इटरेटर्स कहलाते हैं। इटरेटर्स लिस्ट, मैप और सेट जैसे डेटा प्रकारों पर काम कर सकते हैं।
बाइडायरेक्शनल इटरेटर्स में फॉरवर्ड इटरेटर्स के समान गुण होते हैं, केवल अंतर यह है कि उन्हें डिक्रीमेंट भी किया जा सकता है।
बाइडायरेक्शनल इटरेटर्स के गुण
| गुण | मान्य एक्सप्रेशन्स |
|---|---|
| डिफ़ॉल्ट-कंस्ट्रक्टिबल, कॉपी-कंस्ट्रक्टिबल, कॉपी-असाइनेबल और डिस्ट्रक्टिबल | 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 को असाइन किया जा सकता है)।
मुख्य विशेषताएं
- बाइडायरेक्शनल इटरेटर्स फॉरवर्ड इटरेटर्स की सभी विशेषताओं का समर्थन करते हैं, और प्रीफिक्स और पोस्टफिक्स डिक्रीमेंट ऑपरेटर्स भी
- इस प्रकार का इटरेटर दोनों दिशाओं में तत्वों को एक्सेस कर सकता है - अंत की ओर और शुरुआत की ओर
- रैंडम एक्सेस इटरेटर भी एक प्रकार का बाइडायरेक्शनल इटरेटर है
- बाइडायरेक्शनल इटरेटर्स में फॉरवर्ड इटरेटर की विशेषताएं होती हैं, लेकिन एकमात्र अंतर यह है कि यह इटरेटर डिक्रीमेंट भी हो सकता है
उदाहरण
#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;
cout << "Forward: ";
for(it = vec.begin(); it != vec.end(); it++)
cout << *it << " ";
cout << endl;
cout << "Reverse: ";
for(rev_it = vec.rbegin(); rev_it != vec.rend(); rev_it++)
cout << *rev_it << " ";
cout << endl;
return 0;
}
आउटपुट
Forward: 1 2 3 4 5 6 7 8 9 10 Reverse: 10 9 8 7 6 5 4 3 2 1
कौन से कंटेनर्स बाइडायरेक्शनल इटरेटर्स का समर्थन करते हैं?
- std::list
- std::set / std::multiset
- std::map / std::multimap
- std::vector (रैंडम एक्सेस इटरेटर भी प्रदान करता है)
- std::deque (रैंडम एक्सेस इटरेटर भी प्रदान करता है)
नोट: std::forward_list केवल फॉरवर्ड इटरेटर प्रदान करता है, बाइडायरेक्शनल नहीं।