Const_iterator 和 iterator 之间的区别是什么?

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

谢谢你。

140505 次浏览

没有性能差异。

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

当您有一个对容器的常量引用时,您只能得到一个 const_iterator

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

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

在表现方面没有什么不同。const_iterator over 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 修改内容,将得到一个错误,因为它是只读的。

如果你有一个列表,然后下面的陈述

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