关于 STL 内部的实现,这两者之间有什么区别。 在表现上有什么不同? 我想当我们在“只读智能”中遍历向量时,我们更喜欢 const_iterator,对吗?
const_iterator
谢谢你。
没有性能差异。
const_iterator是一个迭代器,它指向 const 值(如 const T*指针) ; 取消引用它返回一个对常量值(const T&)的引用,并防止修改引用的值: 它强制 const-正确。
const T*
const T&
const
当您有一个对容器的常量引用时,您只能得到一个 const_iterator。
编辑: 我提到了“ const_iterator返回常量指针”,这是不准确的,感谢 Brandon 指出这一点。
编辑: 对于 COW 对象,获得一个非常量迭代器(或解引用它)可能会触发副本。(一些过时的、现在不允许的 std::string实现使用 COW。)
std::string
在表现方面没有什么不同。const_iterator over 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,它不允许写入或修改容器的成员。
integers
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