2011-11-04 42 views
5

我想了解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_iterator应该禁止修改容器的元素。但是,此代码无需投诉即可编译。这是因为有一个额外的间接进行的水平? const_iterator究竟做了什么?

UPDATE

而在这样的情况下,是否使用常量性最佳做法?

+0

“修改”意味着'* it = some_other_thing',这不是你正在做的事情。 –

回答

10

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

*it = ..something..; 
4

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

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

2

const_iterator是不是关于是否可以修改容器,但是关于是否可以修改容器中的对象。在你的情况下,容器包含指针,你不能修改指针本身(除了你可以修改整数...)你仍然可以在集合中的指针后面调用非const的Refresh(),因为那个调用会不改变指针本身

const_iterator和iterator之间的区别是很重要的[只有]当你的容器包含例如类实例,而不是指向他们,但实例本身,例如在容器

list < pair < int , int > > 

如果“它”是一个常量性进入这个名单,你不能这样做

it->first = 5 

但如果它是迭代器(不是const_iterator),可以工作。

+0

它也关于你是否可以修改容器 - 可以用'iterator'而不是'const_iterator'来调用'erase'和'insert'等函数。 –

+0

@MikeSeymour不像你说的那样。你仍然可以使用'erase'和'insert'与'const_iterator'。实际上,C++ 11明确地改变了这些,以采用'const_iterator'而不是'iterartor':http://www.cplusplus.com/reference/list/list/insert/ http://www.cplusplus.com /参考/列表/列表/擦除/ – jbx