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