2011-11-04 44 views
5

Tôi đang cố gắng hiểu ý nghĩa của const_iterator. Tôi có đoạn code ví dụ sau:Hiểu const_iterator với con trỏ?

void CustomerService::RefreshCustomers() 
{ 
    for(std::vector<Customer*>::const_iterator it = customers_.begin(); 
     it != customers_.end() ; it ++) 
    { 
     (*it)->Refresh(); 
    } 
} 

Refresh() là một phương pháp trong lớp Customer và nó không được định nghĩa là const. Lúc đầu, tôi nghĩ rằng const_iterator được cho là không cho phép sửa đổi các yếu tố của container. Tuy nhiên, mã này biên dịch mà không có khiếu nại. Đây có phải là vì có thêm một mức độ gián tiếp đang diễn ra không? Chính xác const_iterator làm/nghĩa là gì?

CẬP NHẬT

Và trong một tình huống như thế này, là nó thực hành tốt nhất để sử dụng const_iterator?

+0

"sửa đổi" có nghĩa là '* it = some_other_thing', đó không phải là những gì bạn đang làm. –

Trả lời

10

A const_iterator trên vector<Customer*> sẽ cung cấp cho bạn Customer * const không phải là Customer const*. Vì vậy, bạn không thể thực sự thay đổi giá trị được lặp lại (một con trỏ), nhưng bạn chắc chắn có thể thay đổi đối tượng được trỏ đến bởi nó. Về cơ bản tất cả những gì nói trong trường hợp của bạn là bạn không thể làm điều này:

*it = ..something..; 
4

Bạn sẽ không sửa đổi các nội dung của container. Các nội dung của container chỉ là con trỏ. Tuy nhiên, bạn có thể tự do sửa đổi bất cứ điều gì con trỏ trỏ đến.

Nếu bạn không muốn sửa đổi những gì con trỏ trỏ đến, bạn cần có một vector<const Customer*>.

2

const_iterator là không về việc bạn có thể sửa đổi vùng chứa hay không, nhưng về việc bạn có thể sửa đổi các đối tượng trong vùng chứa hay không. Trong trường hợp của bạn container chứa con trỏ, và bạn không thể sửa đổi con trỏ (bất kỳ nhiều hơn bạn có thể sửa đổi số nguyên ...) Bạn vẫn có thể thực hiện cuộc gọi đến không làm mới() phía sau con trỏ từ bộ sưu tập, bởi vì cuộc gọi đó không thay đổi con trỏ chính nó.

Sự khác biệt giữa trình tối ưu hóa và trình lặp là quan trọng [chỉ] khi vùng chứa của bạn chứa ví dụ: trường lớp, không phải con trỏ với họ, nhưng các trường hợp bản thân, ví dụ như trong một container

list < pair < int , int > > 

Nếu 'nó' là một const_iterator vào danh sách này, bạn không thể làm

it->first = 5 

nhưng nếu nó là iterator (không phải const_iterator), hoạt động.

+0

Đó cũng là về việc bạn có thể sửa đổi các hàm chứa - chẳng hạn như 'erase' và' insert' có thể được gọi với một 'iterator' nhưng không phải là' const_iterator'. –

+0

@MikeSeymour Không giống như bạn đang nói. Bạn vẫn có thể sử dụng cả 'xóa' và' chèn' bằng 'const_iterator'. Trong thực tế, C++ 11 đã thay đổi một cách cụ thể để lấy một 'const_iterator' thay vì một' iterartor': http://www.cplusplus.com/reference/list/list/insert/ http://www.cplusplus.com/tham khảo/danh sách/danh sách/xóa / – jbx