Sự Khác Biệt Giữa Const_ Iterator C++ Là Gì ? Tự Học C/C++
Bạn đang xem: Sự Khác Biệt Giữa Const_ Iterator C++ Là Gì ? Tự Học C/C++
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 IteratorVớ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
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
std::list
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
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
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.