Iterator C++ Là Gì
Bạn đang xem: Iterator c++ là gì
Trong bài học về STL containers, mình đã giới thiệu với chúng ta một số class được áp dụng để tạo ra các container với mọi cách tổ chức dữ liệu không giống nhau. Tuy nhiên, tập hợp các phần tử được chứa bên trong container vẫn đang còn một lẻ tẻ tự một mực (tùy vào thuật toán sắp xếp được chọn), và để xem xét qua các bộ phận trong những container chúng ta sẽ sử dụng những STL Iterator tương ứng.
STL Iterator
Một Iterator là một đối tượng rất có thể đi qua (iterate over) một container class nhưng mà không cần phải biết trật tự những phần tử phía bên trong mảng. Iterator còn là một một phương pháp để truy cập dữ liệu bên phía trong các container.
Các chúng ta có thể hình sử dụng Iterator y hệt như một nhỏ trỏ trỏ đến 1 phần tử nào đó bên trong container với một số toán tử đã có được định nghĩa:
Operator* cereference với trả về giá trị bên phía trong container trên vị trí cơ mà iterator được đặt.Operator++ di chuyển iterator đến bộ phận tiếp theo trong container.Operator-- trái lại so cùng với operator++.Operator== với operator!= dùng làm so sánh vị trí tương đối của 2 thành phần đang được trỏ đến vị 2 iterator.Operator= dùng làm gán vị trí mà iterator trỏ đến.Khai báo một IteratorVới từng container class bọn họ sẽ tất cả một dạng hình iterator tương ứng. Mình sẽ lấy lấy ví dụ về iterator của class std::vector như sau:
#include
Lưu ý: kiểu dữ liệu của các bộ phận trong container class sẽ là phong cách dữ liệu được sử dụng cho generic_type của iterator.
Ví dụ khi chúng ta muốn có một Iterator sử dụng cho một std::list
std::list
Xem thêm: Đà Nẵng Công Bố Điểm Thi Lớp 10 Năm 2016 Đà Nẵng Năm 2016, Điểm Chuẩn Vào Lớp 10 Tại Đà Nẵng Năm 2016
Mỗi container class trong STL (ngoại trừ những container đặc biệt quan trọng như std::stack và std::queue) phần nhiều chứa có mang của một iterator mặt trong.

Và rất nhiều container gồm chứa quan niệm class iterator sẽ có những phương thức trả về quý giá kiểu iterator tương ứng:
begin() trả về một iterator thay mặt cho địa chỉ của phần tử đầu tiên vào container.end() trả về một iterator thay mặt cho vị trí đứng ngay sau bộ phận cuối cùng trong container.cbegin() trả về một hằng (read-only) iterator đại diện thay mặt cho địa chỉ của thành phần đầu tiên trong container.cend() trả về một hằng (read-only) iterator đại diện cho địa chỉ đứng ngay lập tức sau phần tử cuối thuộc trong container.Ví dụ:
int main()std::vector<__int32> vec;for (int i = 0; i < 10; i++)vec.push_back(i);std::vector<__int32>::iterator the_beginning = vec.begin();std::vector<__int32>::iterator the_end = vec.end();std::cout << *(the_beginning._Ptr) << std::endl;std::cout << *(the_end._Ptr) << std::endl; //print a garbage valuethe_end--;std::cout << *(the_end._Ptr) << std::endl;return 0;Lần in giá bán trị thứ hai trong đoạn công tác trên sẽ in ra một quý giá rác, bởi iterator the_end bây giờ đang trỏ đến vị trí nằm ngoài giới hạn vùng nhớ khớp ứng với vec
Tại sao end() lại trả về địa điểm đứng sau phần tử cuối cùng trong container?
Đó là vì họ sẽ sử dụng iterator này để kiểm tra xem thử họ đã chăm nom hết thành phần trong mảng tuyệt chưa. Ví dụ:
std::vector<__int32> vec;for (int i = 0; i < 10; i++)vec.push_back(i);std::vector<__int32>::iterator iter = vec.begin();while (iter != vec.end())std::cout << *iter << std::endl;iter++;Khi vòng lặp while kiểm tra đc iter đã lặp cho vị trí end(), nó sẽ hiểu rằng iter sẽ trỏ ra bên ngoài giới hạn của container và ngừng vòng lặp.
Mình đem thêm một lấy ví dụ như khác sử dụng iterator để duyệt y qua toàn bộ phần tử phía bên trong một std::map:
#include
Hẹn chạm mặt lại các bạn trong bài bác học tiếp sau trong khóa học lập trình C++ phía thực hành.