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ì mymap
là const
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()
và 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.
Tại sao nó trả về 'const_iterator '? Tất cả các ví dụ tôi đã thấy chỉ trả về 'iterator'. – pighead10
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/ –
@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'. –