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[]
và end[]
hoặc cbegin[]
và 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ứaGiả 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ênTa 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