2011-05-03 22 views

Trả lời

15

Sử dụng const_iterator như:

map<string,Shopable*>::const_iterator it = mymap.begin(); 

Từ lỗi, rõ ràng rằng mymap.begin() lợi nhuận của nó const_iterator. Đó là bởi vì mymapconst trong hàm mà bạn đã viết này, một cái gì đó như sau:

void f(const std::map<int,int> & m) 
{ //^^^^^ note this 

     std::map<int,int>::const_iterator it = m.begin(); //m is const in f() 
         //^^^^^ note this 
} 

void g(std::map<int,int> & m) 
{ 
     std::map<int,int>::iterator it = m.begin(); //m is non-const in g() 
} 

Đó là, const container (cho dù nó std::map, std::vector vv) trả const_iterator và container không const lợi nhuận iterator.

Mỗi vùng chứa có chức năng quá tải là begin()end(). Vì vậy, const container gọi quá tải begin() trả về const_iterator và thùng chứa không const gọi quá tải khác begin() trả về iterator. Và tương tự cho end() chức năng quá tải.

+0

Tại sao nó trả về 'const_iterator '? Tất cả các ví dụ tôi đã thấy chỉ trả về 'iterator'. – pighead10

+0

std :: map.begin() cũng có một quá tải trả về một 'iterator'. Xem http://www.cplusplus.com/reference/stl/map/begin/ –

+0

@Pig Head: Tôi đã cung cấp câu trả lời, nhưng về cơ bản có hai tình trạng quá tải, một trong số đó là hàm thành viên const, cái còn lại là một chức năng thành viên không phải là const. Sau đó, bạn gọi 'begin()' trên một đối tượng non-const, nó sẽ lấy phiên bản không const và trả về một 'iterator', khi bạn gọi' begin() 'trên một bản đồ const nó sẽ nhận phiên bản const và trả về 'const_iterator'. –

4

Vấn đề là mymap trong mã ở trên là bản đồ không đổi, không phải bản đồ có thể thay đổi (có thể là thành viên của lớp và mã đó nằm trong hàm thành viên không đổi?). Vì vậy, các cuộc gọi đến mymap.begin() sẽ pichup quá tải mà trả về một const_iterator thay vì quá tải mà trả về một iterator.

Nếu bạn không cần thay đổi vùng chứa thông qua trình lặp, hãy sử dụng const_iterator. Nếu bạn dự định sửa đổi bản đồ, hãy đảm bảo rằng bạn đang sử dụng đối tượng không phải const cho vòng lặp (có thể hàm thành viên (nếu đó là trường hợp) không phải là const?)

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