Iterator C++ Là Gì

     
Chào chúng ta đang theo dõi khóa huấn luyện và đào tạo lập trình trực tuyến ngữ điệu C++.

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 Iterator

Vớ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 #include using namespace std;int main()std::vector vec;std::vector::iterator iter;return 0;Như vậy, họ có iter là một đối tượng người tiêu dùng của class std::vector::iterator. Với giải pháp khai báo này, chúng ta cũng có thể là gồm một class thương hiệu là iterator được định nghĩa phía bên trong khối lệnh của class std::vector.

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 thì Iterator sẽ được khai báo như sau:

std::list::iterator iter;Các cách thức trả về mẫu mã Iterator của những container classNhư các bạn đã biết, một giá bán trị muốn được gán mang lại một trở thành (hoặc một đối tượng người sử dụng nào đó) thì quý giá và biến đổi đó buộc phải cùng kiểu tài liệu với nhau. Như vậy, ý muốn gán địa chỉ cửa hàng (vị trí) của một trong những phần tử vào container cho một iterator thì chúng ta cũng cần có những phương thức trả về quý giá kiểu iterator tương ứng.

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, trong khi chỉ số của phần tử cuối thuộc trong container là (vec.size() - 1).

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 #include #include int main() std::map mymap; mymap.insert(std::make_pair(4, "apple")); mymap.insert(std::make_pair(2, "orange")); mymap.insert(std::make_pair(1, "banana")); mymap.insert(std::make_pair(3, "grapes")); mymap.insert(std::make_pair(6, "mango")); mymap.insert(std::make_pair(5, "peach")); std::map::const_iterator it; // declare an iterator it = mymap.begin(); // assign it to the start of the vector while (it != mymap.end()) // while it hasn"t reach the kết thúc std::cout << it->first << "=" << it->second << " "; // print the value of the element it points khổng lồ ++it; // and iterate khổng lồ the next element std::cout << std::endl;

Tổng kết

STL Iterator tương tự như như một dạng con trỏ chỉ sử dụng cho những STL Container class tương ứng. Sử dụng những STL Iterator hoàn toàn có thể giảm thiểu mối nguy khốn cho công tác thay vày phải sử dụng con trỏ cho các mảng dữ liệu. Khi áp dụng STL Iterator, họ không cần thân thiện dữ liệu phía bên trong container được tổ chức như thế nào, nhưng mà chỉ biết công dụng khi sử dụng iterator để cẩn thận qua container.

Xem thêm: Thử Ngay 5 Cách Làm Gì Để Tóc Không Rụng Tóc: 22 Mẹo Giúp Bảo Vệ Tóc Của Bạn

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.