Video: Bài 44. Tìm vị trí của số lớn nhất trong mảng 2025
Các lập trình viên C + + iterates qua một mảng bằng cách cung cấp các chỉ số của mỗi phần tử. Tuy nhiên, kỹ thuật này không hoạt động cho các thùng chứa như danh sách mà không cho phép truy cập ngẫu nhiên. Người ta có thể tưởng tượng được một giải pháp dựa trên các phương pháp như getFirst () và getNext () ; tuy nhiên, các nhà thiết kế của Thư viện Tiêu bản Tiêu chuẩn muốn cung cấp một phương pháp phổ biến để đi qua bất kỳ loại container.
Đối với điều này, Thư viện Tiêu bản Tiêu chuẩn định nghĩa trình lặp.
An iterator là một đối tượng trỏ đến các thành viên của một container. Nói chung, mỗi Iterator hỗ trợ các chức năng sau:
-
Một lớp có thể trả về một Iterator trỏ đến thành viên đầu tiên của bộ sưu tập.
-
Trình lặp có thể được di chuyển từ thành viên này sang thành viên khác.
-
Trình lặp sẽ trả về một chỉ thị khi nó đến cuối danh sách.
-
Chương trình có thể lấy ra các phần tử được chỉ ra bởi các Iterator.
Thư viện Tiêu chuẩn Tiêu chuẩn cũng cung cấp các trình lặp đi lặp lại để di chuyển ngược qua danh sách. Mọi thứ ở đây về vòng lặp đều được áp dụng cho các vòng lặp đảo ngược.
Mã cần thiết để lặp qua danh sách khác với những gì cần thiết để đi qua một vector (để chỉ hai ví dụ). Tuy nhiên, trình lặp lại ẩn các chi tiết này.
Phương thức này bắt đầu () trả về một trình lặp lại trỏ tới phần tử đầu tiên của một danh sách. Toán tử indirection * () lấy ra một tham chiếu đến đối tượng được trỏ bởi trình lặp. Toán tử ++ di chuyển vòng lặp tới phần tử kế tiếp trong danh sách.
Một chương trình tiếp tục tăng dần theo cách của nó thông qua danh sách cho đến khi iterator bằng với giá trị trả về bởi end () . Đoạn mã dưới đây bắt đầu từ đầu danh sách sinh viên và hiển thị mỗi tên của chúng:
void displayStudents (list & students) {// phân bổ một Iterator trỏ tới phần tử // đầu tiên trong danh sách:: iterator iter = học sinh. bắt đầu (); / / Tiếp tục lặp qua danh sách cho đến khi / / iterator chạm vào cuối của danh sách trong khi (iter! = students. end ()) {/ / lấy Student các iterator điểm tại Student 's = * iter; cout << s. sName << endl; // Bây giờ di chuyển iterator tới phần tử kế tiếp // trong danh sách iterator ++;}}
Các khai báo cho các Iterator có thể rất phức tạp. Đây có thể là sự biện hộ tốt nhất cho tuyên bố auto được giới thiệu với tiêu chuẩn '11:
cho (auto iter = students. Begin (); iter! = Students. End (); iter ++) {coutĐiều này tuyên bố iter là một Iterator của bất kỳ loại nào được trả về bởi danh sách các method:: begin () , tránh các tờ khai tra tấn được trình bày trong đoạn mã trước đó.Thật cool!