Chỉ cần một chút giới thiệu, với những từ đơn giản. Trong C++, các trình vòng lặp là "thứ" mà bạn có thể viết ít nhất toán tử dereference *it
, toán tử tăng ++it
và cho các trình vòng lặp hai chiều nâng cao hơn, số giảm --it
và cuối cùng nhưng không kém phần quan trọng. chỉ số it[]
và có thể cộng và trừ.C++ std :: vector <> :: iterator không phải là một con trỏ, tại sao?
"Những thứ" như vậy trong C++ là đối tượng của các loại có quá tải theo toán tử hoặc các con trỏ đơn giản và đơn giản.
std::vector<>
là một lớp chứa bao quanh một mảng liên tục, vì vậy con trỏ như trình vòng lặp có ý nghĩa. Trên lưới, và trong một số tài liệu bạn có thể tìm thấy vector.begin()
được sử dụng như một con trỏ.
Lý do để sử dụng con trỏ là chi phí thấp hơn, hiệu suất cao hơn, đặc biệt nếu trình biên dịch tối ưu phát hiện lặp lại và thực hiện điều đó (hướng dẫn vector và nội dung). Sử dụng trình vòng lặp có thể khó hơn cho trình biên dịch để tối ưu hóa.
Biết điều này, câu hỏi của tôi là tại sao việc triển khai STL hiện đại, giả sử MSVC++ 2013 hoặc libstdC++ trong Mingw 4.7, sử dụng lớp đặc biệt cho trình lặp vector?
Câu hỏi đặt ra là: tại sao không? Trái với những gì bạn nghĩ, việc sử dụng các lớp thay vì con trỏ không hàm ý thêm chi phí, và việc sử dụng các lớp học có những lợi ích tiềm năng khác. –
Vì trình vòng lặp là một điều phổ biến. Có, cho vector nó giống như một con trỏ, nhưng ví dụ một list_iterator là hoàn toàn khác nhau, khi bạn ++ một danh sách iterator nó sẽ không chỉ là một sizeof (pointerType) bù đắp từ con trỏ. Ngoài ra, algorythms có thể sử dụng iterators vì iterators hứa rằng ++ chúng sẽ trả về phần tử tiếp theo ... một con trỏ chỉ không làm điều này. – Melkon
Một lý do là an toàn: thư viện có các xác nhận về dereferencing một trình lặp không hợp lệ. – Quentin