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