Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

C++ Bidirectional Iterators (อิเทอเรเตอร์แบบทิศทางสองทาง)


อิเทอเรเตอร์ที่มีสิทธิ์เข้าถึงลำดับขององค์ประกอบในช่วง (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