Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Bidirectional Iterators (Bộ lặp hai chiều) trong C++

Các iterator có quyền truy cập chuỗi phần tử của một phạm vi từ cả hai hướng (từ đầu và từ cuối) được gọi là bidirectional iterators. Các iterator này có thể làm việc với các kiểu dữ liệu như list, map và set.

Bidirectional iterators có cùng các tính chất như forward iterators, với sự khác biệt duy nhất là chúng cũng có thể bị giảm (decremented).

Bảng các tính chất và biểu thức hợp lệ

Tính chất Biểu thức hợp lệ
Có thể khởi tạo mặc định, sao chép, gán và hủy X a; X b(a); b = a;
Có thể so sánh bằng/khác nhau (khi cả hai lặp trên cùng chuỗi) a == b; a != b;
Có thể dereference như rvalue *a; a->m;
Iterator có thể thay đổi: dereference như lvalue *a = t
Có thể tăng (++), kết quả dereferenceable hoặc past-the-end ++a; a++; *a++;
Có thể giảm (--) nếu có iterator dereferenceable trước đó --a; a--; *a--;
Lvalues có thể hoán đổi swap(a,b)

Trong đó X là bidirectional iterator, a và b là đối tượng kiểu iterator này, t là đối tượng kiểu được trỏ bởi iterator (hoặc kiểu khác có thể gán cho lvalue trả về khi dereference kiểu X).

Đặc điểm chính

  • Hỗ trợ tất cả tính năng của forward iterator, cộng thêm toán tử giảm tiền tố (--) và hậu tố.
  • Có thể truy cập phần tử theo cả hai hướng: về cuối và về đầu.
  • Random access iterator cũng là một loại bidirectional iterator.
  • Khác với forward iterator chỉ ở chỗ có thể giảm.

Ví dụ

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;
    
    // Duyệt xuôi
    for(it = vec.begin(); it != vec.end(); it++)
        cout << *it << " ";
    cout << endl;
    
    // Duyệt ngược
    for(rev_it = vec.rbegin(); rev_it != vec.rend(); rev_it++)
        cout << *rev_it << " ";
}

Kết quả

1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1