145

关于 STL 内部的实现,这两者之间有什么区别。性能有什么区别?我想当我们以“只读方式”遍历向量时,我们更喜欢const_iterator,对吧?

谢谢你。

4

3 回答 3

141

没有性能差异。

Aconst_iterator是一个指向 const 值的迭代器(就像一个const T*指针);取消引用它会返回对常量值的引用 ( const T&) 并防止修改引用的值:它强制执行const-correctness

当你有一个对容器的 const 引用时,你只能得到一个const_iterator.

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

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

于 2011-03-18T00:52:11.487 回答
49

性能方面没有区别。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 修改内容,您将收到错误,因为它是只读的。

于 2015-01-26T18:47:13.827 回答
10

如果您有一个列表 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
于 2017-03-01T15:20:22.473 回答