const_iterator和iterator有什么区别?

这两者在STL里面的实现有什么区别。 性能有什么不同? 我猜什么时候只读,我们更喜欢const_iterator。 对?

谢谢。

没有性能差异。

const_iterator是一个指向const值的迭代器(就像一个const T*指针); 解引用它返回一个对常量值的引用( const T& ),并防止修改引用的值:它强制const正确性 。

当你有一个容器的const引用时,你只能得到一个const_iterator

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

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

性能明智没有区别。 将const_iterator放在iterator的唯一目的是pipe理相应迭代器运行的容器的访问性。 你可以用一个例子更清楚地理解它:

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

如果我们要读写一个容器的成员,我们将使用迭代器:

 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; } 

注意:如果您尝试在第二种情况下使用*进行修改,则会因为其只读而出现错误。

如果你有一个列表,然后下面的语句

 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