关于 STL 内部的实现,这两者之间有什么区别。性能有什么区别?我想当我们以“只读方式”遍历向量时,我们更喜欢const_iterator
,对吧?
谢谢你。
关于 STL 内部的实现,这两者之间有什么区别。性能有什么区别?我想当我们以“只读方式”遍历向量时,我们更喜欢const_iterator
,对吧?
谢谢你。
没有性能差异。
Aconst_iterator
是一个指向 const 值的迭代器(就像一个const T*
指针);取消引用它会返回对常量值的引用 ( const T&
) 并防止修改引用的值:它强制执行const
-correctness。
当你有一个对容器的 const 引用时,你只能得到一个const_iterator
.
编辑:我提到“const_iterator
返回常量指针”不准确,感谢 Brandon 指出。
编辑:对于 COW 对象,获取非常量迭代器(或取消引用它)可能会触发副本。(一些过时且现在不允许std::string
使用 COW 的实现。)
性能方面没有区别。const_iterator
结束的唯一目的iterator
是管理运行相应迭代器的容器的可访问性。你可以通过一个例子更清楚地理解它:
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; }
注意:如果您尝试在第二种情况下使用 *it 修改内容,您将收到错误,因为它是只读的。
如果您有一个列表 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