2010-04-28 37 views
26

Mã với trình vòng lặp trông khá giống mã với con trỏ. Các bộ lặp của một số loại tối nghĩa (ví dụ như std::vector<int>::iterator).Vòng lặp và con trỏ liên quan như thế nào?

Những gì tôi không nhận được là cách vòng lặp và con trỏ có liên quan với nhau - là một trình vòng lặp bao quanh một con trỏ với các hoạt động quá tải để tiến tới các phần tử liền kề hoặc nó là cái gì khác?

Trả lời

44

Bộ lặp là tổng quát của con trỏ.

Trình lặp (tùy thuộc vào các biến thể) phải triển khai * và ++

Vì vậy, con trỏ IS là trình lặp. Nhưng không nhất thiết phải là cách khác.

Nếu bạn muốn lặp qua cấu trúc phức tạp (cây, biểu đồ ...), trình lặp sẽ nhiều hơn con trỏ và không đưa ra bất kỳ tham chiếu nào đến một số địa điểm thực trong ram.

+7

chúng ta có thể nói con trỏ là tập hợp con của trình lặp không? – solti

+7

Có, tuyệt đối –

7

Khái niệm, có - nhưng chúng không cần phải là con trỏ. Nội bộ và khả năng của họ sẽ phụ thuộc vào cấu trúc dữ liệu mà họ "quấn".

Đó là lý do tại sao có khác nhau "classes" of iterators. Ví dụ. Một chiều, hai chiều, RandomAccess, v.v.

Một số có thể có nhiều lớp.

Ví dụ: nếu cấu trúc bên trong là một cây Đỏ-Đen hoặc Danh sách Liên kết, các trình vòng lặp có thể là Hai chiều, nhưng không phải là RandomAccess. Nếu chúng bọc một vector (được thực hiện như một mảng), bạn sẽ có RandomAccess và hai chiều.

7

Bộ lặp là đối tượng quá tải một số toán tử nhất định, do đó việc sử dụng sẽ giống như chúng là con trỏ. Đó là trong khả năng của một loại vòng lặp đã cho. Trình vòng lặp truy cập ngẫu nhiên trông hoàn toàn giống như con trỏ, các loại trình vòng lặp khác không cung cấp một số hoạt động (ví dụ: list<X>::iterator là hai chiều không có toán tử += trong số nhiều người khác yêu cầu truy cập ngẫu nhiên).

Đối với các "tên ít người biết", nó không phải là hoàn toàn không thể tưởng tượng để sử dụng một con trỏ đơn giản cho một iterator:

template <class T> 
class MyContainer 
{ 
    ... 
    typedef T* iterator; 
} 

MyContainer<int>::iterator it; //the type is really int* 
3

Một iterator chỉ là một khái niệm mà cung cấp giao diện cần thiết cho vòng lặp - đây là những khác nhau cho các loại trình lặp khác nhau và được quy định trong phần 24.1 của tiêu chuẩn C++ (Yêu cầu Iterator).

Cách trình vòng lặp được triển khai phụ thuộc vào những gì chúng lặp lại - đối với vectơ, chúng thường là một trình bao bọc xung quanh một con trỏ duy nhất tới một mảng (trong bản phát hành), đối với các thùng chứa phức tạp hơn chúng có triển khai phức tạp hơn. Đối với các phạm vi kết thúc mở, chúng sẽ chứa trạng thái của bất kỳ thuật toán nào được sử dụng để tạo các phần tử.

Lưu ý rằng một con trỏ đến một phần tử trong một mảng đáp ứng các yêu cầu của một trình vòng lặp truy cập ngẫu nhiên, do đó ở một mức độ nào đó chúng có thể hoán đổi cho nhau.

+2

Tôi nghĩ từ này là * khái niệm * thay vì * loại * tại đây. –

Các vấn đề liên quan