Làm thế nào để sử dụng iterator trong C?

Hãy coi bài viết này là một phần đồng hành với bài viết của tôi về container. https. // nhà phát triển. đến/noah11012/container-in-c-34pi

Động lực để sử dụng các trình vòng lặp trong C là gì? . Sử dụng thuật toán như std::find[] không hoạt động trên chính vùng chứa. Thay vào đó, sử dụng một lớp trừu tượng được gọi là iterators. Điều này cho phép các thuật toán tiêu chuẩn hoạt động trên bất kỳ vùng chứa tiêu chuẩn nào một cách gián tiếp thông qua các trình vòng lặp mà nó cung cấp. Để truy cập các trình vòng lặp được cung cấp vùng chứa này, chúng tôi sử dụng các phương thức begin[]end[] hoặc cbegin[]cend[] cho các phiên bản const

begin[] trỏ đến phần tử đầu tiên trong vùng chứa trong khi end[] trỏ đến phần tử trước phần tử cuối cùng. Hầu như hoạt động giống như bộ kết thúc null trong Chuỗi C

Các thuật toán do tiêu chuẩn cung cấp có thể hoạt động trên các loại tùy chỉnh, miễn là nó triển khai một trình vòng lặp có các phương thức phổ biến của một trình vòng lặp điển hình. Ngoài ra còn có các loại vòng lặp khác nhau.

void iter_new[Iterator *iter];
void iter_advance[Iterator *iter];
void iter_jump[Iterator *iter, int pos];
void iter_read[Iterator *iter, int *out_value];
void iter_write[Iterator *iter, int value];
2 và
void iter_new[Iterator *iter];
void iter_advance[Iterator *iter];
void iter_jump[Iterator *iter, int pos];
void iter_read[Iterator *iter, int *out_value];
void iter_write[Iterator *iter, int value];
0 là hai trong số đó.
void iter_new[Iterator *iter];
void iter_advance[Iterator *iter];
void iter_jump[Iterator *iter, int pos];
void iter_read[Iterator *iter, int *out_value];
void iter_write[Iterator *iter, int value];
2 được sử dụng để đọc một phần tử sau đó tăng dần đến phần tử tiếp theo.
void iter_new[Iterator *iter];
void iter_advance[Iterator *iter];
void iter_jump[Iterator *iter, int pos];
void iter_read[Iterator *iter, int *out_value];
void iter_write[Iterator *iter, int value];
0 cũng tương tự ngoại trừ nó ghi các giá trị vào một vùng chứa

Giả sử đối với cuộc thảo luận này, chúng ta sẽ làm việc với các vectơ hoặc mảng có thể tự thay đổi kích thước khi cần thiết. Chúng tôi cũng có một thuật toán tìm kiếm nhị phân,

void iter_new[Iterator *iter];
void iter_advance[Iterator *iter];
void iter_jump[Iterator *iter, int pos];
void iter_read[Iterator *iter, int *out_value];
void iter_write[Iterator *iter, int value];
3 có một trình lặp bắt đầu và một kết thúc và một giá trị để tìm kiếm. Để không làm phức tạp mọi thứ, chúng tôi sẽ chỉ thêm khả năng tìm kiếm số nguyên

Ta sẽ có cấu trúc sau

typedef struct
{
    int *values;
    int  curr_index;
} Iterator;

Và một số chức năng

void iter_new[Iterator *iter];
void iter_advance[Iterator *iter];
void iter_jump[Iterator *iter, int pos];
void iter_read[Iterator *iter, int *out_value];
void iter_write[Iterator *iter, int value];

Chúng tôi sẽ không lo lắng về chi tiết triển khai của các chức năng này để không làm lộn xộn cuộc thảo luận về tầm quan trọng của các trình vòng lặp

Loại trình vòng lặp mà chúng tôi đã tạo này được gọi là trình vòng lặp truy cập ngẫu nhiên. Điều này có nghĩa là chúng ta có thể chuyển đến bất cứ đâu chúng ta muốn trong các phần tử của vùng chứa thay vì đọc tuần tự từng phần tử theo tiến trình

Điều này rất hữu ích vì thuật toán nhị phân nhảy đến giữa mảng để xem phần tử có ở đó không

Ví dụ về iterator trong C là gì?

Ví dụ: sort , sẽ sử dụng trình lặp bắt đầu và kết thúc và sẽ hoạt động với bất kỳ vùng chứa nào

Trình lặp được triển khai như thế nào?

Để triển khai Iterator, chúng ta cần một con trỏ hoặc con trỏ để theo dõi xem chúng ta hiện đang ở phần tử nào . Tùy thuộc vào cấu trúc dữ liệu cơ bản, chúng ta có thể chuyển từ phần tử này sang phần tử khác. Điều này được thực hiện trong phương thức next[] trả về phần tử hiện tại và con trỏ tiến tới phần tử tiếp theo.

Iterator có thể được sử dụng trong vòng lặp không?

Vòng lặp for-each sử dụng một trình lặp bên dưới lớp vỏ . Sự khác biệt chỉ là khả năng đọc [và do đó khả năng bảo trì].

Trình vòng lặp có phải là con trỏ không?

Trình lặp là một đối tượng [như con trỏ ] trỏ đến phần tử bên trong vùng chứa. Chúng ta có thể sử dụng các trình vòng lặp để di chuyển qua nội dung của vùng chứa. Chúng có thể được hình dung như một cái gì đó tương tự như một con trỏ trỏ đến một số vị trí và chúng ta có thể truy cập nội dung tại vị trí cụ thể đó bằng cách sử dụng chúng.

Chủ Đề