Iterator c++ là gì

Chào chúng ta sẽ theo dõi và quan sát khóa học lập trình sẵn trực đường ngôn ngữ C++.

Bạn đang xem: Iterator c++ là gì

Trong bài học về STL containers, tôi đã trình làng với chúng ta một vài class được áp dụng để tạo ra các container với các phương pháp tổ chức triển khai dữ liệu khác nhau. Tuy nhiên, tập thích hợp những bộ phận được chứa bên phía trong container vẫn có một hiếm hoi từ nhất thiết (tùy theo thuật toán bố trí được chọn), và để chăm sóc qua các phần tử trong các container bọn họ đã thực hiện những STL Iterator tương ứng.

STL Iterator

Một Iterator là một trong những đối tượng người dùng có thể đi qua (iterate over) một container class mà ko cần biết cô quạnh tự các bộ phận bên trong mảng. Iterator còn là 1 trong những phương pháp để truy cập tài liệu bên trong những container.

Các bạn có thể hình dùng Iterator y như một con trỏ trỏ đến 1 phần tử làm sao đó bên trong container với một trong những toán thù tử đã có định nghĩa:

Operator* cereference cùng trả về cực hiếm bên phía trong container tại địa chỉ cơ mà iterator được đặt.Operator++ di chuyển iterator mang lại phần tử tiếp sau trong container.Operator-- ngược chở lại so với operator++.Operator== cùng operator!= dùng làm đối chiếu vị trí tương đối của 2 phần tử đang được trỏ cho vì 2 iterator.Operator= dùng để gán địa điểm mà lại iterator trỏ mang đến.Khai báo một Iterator

Với từng container class chúng ta sẽ sở hữu được một giao diện iterator tương ứng. Mình sẽ lấy ví dụ về iterator của class std::vector nlỗi sau:

#include #include using namespace std;int main()std::vector vec;std::vector::iterator iter;return 0;bởi vậy, chúng ta bao gồm iter là một trong đối tượng của class std::vector::iterator. Với giải pháp knhì báo này, bạn cũng có thể là tất cả một class tên là iterator được có mang bên phía trong khối hận lệnh của class std::vector.

Lưu ý: phong cách dữ liệu của những thành phần trong container class sẽ là hình dáng dữ liệu được sử dụng cho generic_type của iterator.

ví dụ như Lúc bọn họ hy vọng bao gồm một Iterator cần sử dụng cho 1 std::list thì Iterator sẽ tiến hành khai báo nhỏng sau:

std::list::iterator iter;Các thủ tục trả về giao diện Iterator của những container classNlỗi chúng ta đã biết, một cực hiếm ước ao được gán cho 1 biến chuyển (hoặc một đối tượng người tiêu dùng làm sao đó) thì quý hiếm cùng biến đó đề nghị thuộc hình dạng dữ liệu với nhau. bởi vậy, ao ước gán hệ trọng (vị trí) của một phần tử trong container cho 1 iterator thì chúng ta cũng cần có các thủ tục trả về cực hiếm giao diện iterator tương ứng.

Xem thêm: Tiểu Sử Diễn Viên Thanh Trúc, Và Bí Mật Chuyện Tình Với Khương Ngọc

Mỗi container class vào STL (quanh đó các container đặc biệt quan trọng nlỗi std::stachồng cùng std::queue) mọi chứa có mang của một iterator phía bên trong.


*

Và đầy đủ container bao gồm đựng định nghĩa class iterator sẽ có đầy đủ cách thức trả về quý hiếm dạng hình iterator tương ứng:

begin() trả về một iterator đại diện thay mặt mang đến địa chỉ của bộ phận trước tiên trong container.end() trả về một iterator thay mặt mang đến địa điểm đứng ngay sau phần tử sau cùng vào container.cbegin() trả về một hằng (read-only) iterator đại diện thay mặt mang đến địa điểm 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 vị trí đứng ngay sau thành phần sau cuối 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_kết thúc = vec.end();std::cout << *(the_beginning._Ptr) << std::endl;std::cout << *(the_over._Ptr) << std::endl; //print a garbage valuethe_end--;std::cout << *(the_kết thúc._Ptr) << std::endl;return 0;Lần in cực hiếm thứ hai trong đoạn công tác trên vẫn in ra một quý giá rác, vì iterator the_kết thúc hôm nay sẽ trỏ đến địa chỉ nằm ko kể số lượng giới hạn vùng ghi nhớ tương xứng cùng với vec, trong lúc chỉ số của bộ phận cuối cùng trong container là (vec.size() - 1).

Tại sao end() lại trả về vị trí che khuất bộ phận sau cuối trong container?

Đó bởi vì họ đã sử dụng iterator này để chất vấn coi test bọn họ vẫn chu đáo hết phần tử vào mảng xuất xắc không. 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 soát được iter vẫn lặp mang đến vị trí end(), nó sẽ hiểu rằng iter đã trỏ ra ngoài số lượng giới hạn của container với xong vòng lặp.

Mình rước thêm 1 ví dụ khác sử dụng iterator nhằm coi sóc qua toàn bộ thành phần phía bên trong một std::map:

#include #include #include int main() std::map mymap; mybản đồ.insert(std::make_pair(4, "apple")); mymaps.insert(std::make_pair(2, "orange")); mymaps.insert(std::make_pair(1, "banana")); mymap.insert(std::make_pair(3, "grapes")); mymap.insert(std::make_pair(6, "mango")); mymaps.insert(std::make_pair(5, "peach")); std::map::const_iterator it; // declare an iterator it = mymaps.begin(); // assign it to the start of the vector while (it != mymap.end()) // while it hasn"t reach the over std::cout << it->first << "=" << it->second << " "; // print the value of the element it points lớn ++it; // và iterate to lớn the next element std::cout << std::endl;

Tổng kết

STL Iterator cũng như nlỗi một dạng nhỏ trỏ chỉ thực hiện cho những STL Container class tương ứng. Sử dụng những STL Iterator có thể bớt tphát âm côn trùng nguy hại mang lại lịch trình nạm vị bắt buộc sử dụng nhỏ trỏ cho các mảng dữ liệu. lúc thực hiện STL Iterator, bọn họ ko bắt buộc quyên tâm dữ liệu bên phía trong container được tổ chức ra sao, cơ mà chỉ biết kết quả Lúc thực hiện iterator nhằm để mắt qua container.

Xem thêm: Truyền Thông Đa Phương Tiện Là Gì ? Hãy Nêu Một Số Ví Dụ Về Đa Phương Tiện

Hẹn gặp mặt lại các bạn trong bài học kinh nghiệm tiếp sau vào khóa học lập trình C++ phía thực hành.


Chuyên mục: ĐÀO TẠO