อิเทอเรเตอร์ที่มีสิทธิ์เข้าถึงลำดับขององค์ประกอบในช่วง (range) จากทั้งสองทิศทาง คือ จากปลายทางและจากจุดเริ่มต้น เรียกว่า bidirectional iterators อิเทอเรเตอร์เหล่านี้สามารถทำงานกับชนิดข้อมูล เช่น list, map และ sets
Bidirectional iterators มีคุณสมบัติเหมือน forward iterators โดยแตกต่างเพียงอย่างเดียวคือสามารถลดค่าได้ (decremented) −
| คุณสมบัติ (property) | นิพจน์ที่ถูกต้อง (valid expressions) |
|---|---|
| เป็น default-constructible, copy-constructible, copy-assignable และ destructible | X a; X b(a); b = a; |
| สามารถเปรียบเทียบความเท่าเทียมกันได้โดยใช้ operator ความเท่า/ไม่เท่า (มีความหมายเมื่ออิเทอเรเตอร์ทั้งสองวนลูปผ่านลำดับพื้นฐานเดียวกัน) | a == b a != b |
| สามารถ dereference เป็น rvalue ได้ (ถ้าอยู่ในสถานะ dereferenceable) | *a a->m |
| สำหรับ mutable iterators (อิเทอเรเตอร์ที่ไม่ใช่ constant): สามารถ dereference เป็น lvalue ได้ (ถ้าอยู่ในสถานะ dereferenceable) | *a = t |
| สามารถเพิ่มค่าได้ (incremented) (ถ้าอยู่ในสถานะ dereferenceable) ผลลัพธ์จะเป็น dereferenceable หรือ past-the-end iterator สองอิเทอเรเตอร์ที่เท่ากัน จะยังคงเท่ากันหลังจากเพิ่มค่าทั้งคู่ | ++a a++ *a++ |
| สามารถลดค่าได้ (decremented) (ถ้ามีค่า dereferenceable iterator อยู่ก่อนหน้า) | --a a-- *a-- |
| Lvalues สามารถสลับได้ (swappable) | swap(a,b) |
โดยที่ X คือ bidirectional iterator, a และ b เป็นอ็อบเจ็กต์ของชนิดอิเทอเรเตอร์นี้ และ t เป็นอ็อบเจ็กต์ของชนิดที่อิเทอเรเตอร์ชี้ไป (หรือชนิดอื่นที่สามารถกำหนดให้กับ lvalue ที่คืนจากการ dereference อ็อบเจ็กต์ชนิด X)
แนวคิดของ Bidirectional iterators ใน C++
Bidirectional iterators รองรับคุณสมบัติทั้งหมดของ forward iterators และรองรับ prefix และ postfix decrement operators ด้วย
ชนิดของอิเทอเรเตอร์นี้สามารถเข้าถึงองค์ประกอบในทั้งสองทิศทางได้ เช่น ไปทางท้ายและไปทางหัว
Random access iterator ก็เป็นชนิดหนึ่งของ bidirectional iterator
Bidirectional iterators มีคุณสมบัติของ forward iterator แตกต่างเพียงอย่างเดียวคืออิเทอเรเตอร์นี้สามารถลดค่าได้อีกด้วย
Input: 1 2 3 4 5 6 7 8 9 10 Output: 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