我试图了解const_iterator的含义。我有以下示例代码:
void CustomerService::RefreshCustomers()
{
for(std::vector<Customer*>::const_iterator it = customers_.begin();
it != customers_.end() ; it ++)
{
(*it)->Refresh();
}
}
Refresh()
是Customer
类中的一个方法,它没有定义为const。起初以为我认为const_iterator应该禁止修改容器的元素。但是,此代码无需投诉即可编译。这是因为还有一个额外的间接水平吗? const_iterator到底是什么意思?
更新
在这种情况下,使用const_iterator是最佳做法吗?
答案 0 :(得分:10)
const_iterator
上的vector<Customer*>
会为您提供Customer * const
而不是Customer const*
。因此,您实际上无法更改迭代的值(指针),但您确定可以更改它指向的对象。基本上它在你的情况下所说的是你不能这样做:
*it = ..something..;
答案 1 :(得分:4)
您没有修改容器的内容。容器的内容只是指针。但是,您可以随意修改指针指向的任何内容。
如果您不想修改指针指向的内容,则需要vector<const Customer*>
。
答案 2 :(得分:2)
const_iterator 不是否可以修改容器,但是是否可以修改容器中的对象。在你的情况下,容器包含指针,你不能修改指针本身(除了你可以修改整数...)你仍然可以在集合的指针后面调用非常量的Refresh(),因为该调用确实不要更改指针本身。
当容器包含例如,const_iterator和迭代器之间的区别很重要[仅]类实例,不是它们的指针,而是实例本身,例如在容器中
list < pair < int , int > >
如果'it'是此列表中的const_iterator,则无法执行
it->first = 5
但如果它是迭代器(不是const_iterator),那就可以了。