5

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

4

3 回答 3

10

A const_iteratorover avector<Customer*>会给你一个Customer * constnot a Customer const*。所以你实际上不能改变被迭代的值(一个指针),但你肯定可以改变它指向的对象。基本上它在你的情况下说的是你不能这样做:

*it = ..something..;
于 2011-11-04T23:49:45.567 回答
4

您没有修改容器的内容。容器的内容只是指针。但是,您可以自由修改指针指向的任何内容。

如果您不想修改指针指向的内容,则需要一个vector<const Customer*>.

于 2011-11-04T23:50:40.940 回答
2

const_iterator不是关于是否可以修改容器,而是关于是否可以修改容器中的对象。在您的情况下,容器包含指针,并且您不能修改指针本身(就像您可以修改整数一样......)您仍然可以在集合中的指针后面调用非常量 Refresh(),因为该调用确实不改变指针本身

const_iterator 和 iterator 之间的区别是重要的[仅]当您的容器包含例如类实例,而不是指向它们的指针,而是实例本身时,例如在容器中

list < pair < int , int > >

如果 'it' 是这个列表中的 const_iterator,你不能这样做

it->first = 5

但如果它是迭代器(不是 const_iterator),那就行得通。

于 2011-11-04T23:56:05.987 回答