const_iterator和iterator有什么区别?

时间:2011-03-18 00:45:12

标签: c++ stl iterator const-iterator

这两个关于STL内部实现的区别是什么。 性能有什么不同? 我想当我们在“只读智能”中遍历向量时,我们更喜欢const_iterator,对吗?

谢谢。

3 个答案:

答案 0 :(得分:117)

没有性能差异。

const_iterator是一个指向const值的迭代器(如const T*指针);取消引用它会返回对常量值(const T&)的引用,并阻止修改引用的值:它强制执行const-correctness

如果对容器有const引用,则只能获得const_iterator

编辑:我提到“const_iterator返回常量指针”这是不准确的,感谢Brandon指出它。

编辑:对于COW对象,获取非const迭代器(或取消引用它)可能会触发复制。 (一些过时且现在不允许的std::string实现使用COW。)

答案 1 :(得分:35)

表现明智没有区别。使const_iterator超过iterator的唯一目的是管理运行相应迭代器的容器的可访问性。您可以通过示例更清楚地理解它:

std::vector<int> integers{ 3, 4, 56, 6, 778 };

如果我们阅读&amp;写一个容器的成员我们将使用iterator:

for( std::vector<int>::iterator it = integers.begin() ; it != integers.end() ; ++it )
       {*it = 4;  std::cout << *it << std::endl; }

如果我们只读取容器integers的成员,您可能想使用不允许编写或修改容器成员的const_iterator。

for( std::vector<int>::const_iterator it = integers.begin() ; it != integers.end() ; ++it )
       { cout << *it << endl; }

注意:如果您尝试在第二种情况下使用*修改内容,则会出现错误,因为它是只读的。

答案 2 :(得分:6)

如果您有一个列表a然后是以下语句

list<int>::iterator it; // declare an iterator
    list<int>::const_iterator cit; // declare an const iterator 
    it=a.begin();
    cit=a.begin();

您可以使用“it”而不是“cit”更改列表中元素的内容, 也就是说,您可以使用“cit”来阅读不更新元素的内容。

*it=*it+1;//returns no error
    *cit=*cit+1;//this will return error