用指针理解const_iterator?

时间:2011-11-04 23:47:30

标签: c++ const-iterator

我试图了解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是最佳做法吗?

3 个答案:

答案 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),那就可以了。