Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 常量迭代器和迭代器之间的区别是什么?_C++_Stl_Iterator_Const Iterator - Fatal编程技术网

C++ 常量迭代器和迭代器之间的区别是什么?

C++ 常量迭代器和迭代器之间的区别是什么?,c++,stl,iterator,const-iterator,C++,Stl,Iterator,Const Iterator,关于STL内部的实现,这两种方法有什么不同。 性能方面有什么不同? 我猜当我们以“只读方式”遍历向量时,我们更喜欢常量迭代器,对吗 谢谢。没有性能差异 const_迭代器是指向const值的迭代器(类似于const T*指针);取消引用它将返回对常量值(const T&)的引用,并防止修改引用值:它强制执行 当您有一个容器的常量引用时,您只能得到一个const\u迭代器 编辑:我提到了“const_迭代器返回常量指针”,这是不准确的,多亏布兰登指出了这一点 Edit:对于COW对象,获取非常量迭

关于STL内部的实现,这两种方法有什么不同。 性能方面有什么不同? 我猜当我们以“只读方式”遍历向量时,我们更喜欢
常量迭代器
,对吗


谢谢。

没有性能差异

const_迭代器
是指向const值的迭代器(类似于
const T*
指针);取消引用它将返回对常量值(
const T&
)的引用,并防止修改引用值:它强制执行

当您有一个容器的常量引用时,您只能得到一个
const\u迭代器

编辑:我提到了“const_迭代器
返回常量指针”,这是不准确的,多亏布兰登指出了这一点


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

性能方面没有区别。在
迭代器
上使用
常量迭代器
的唯一目的是管理运行相应迭代器的容器的可访问性。你可以通过一个例子更清楚地理解它:

std::vector<int> integers{ 3, 4, 56, 6, 778 };

注意:如果您在第二种情况下尝试使用*it修改内容,您将得到一个错误,因为它是只读的。

如果您有一个列表a,然后是以下语句

list<int>::iterator it; // declare an iterator
    list<int>::const_iterator cit; // declare an const iterator 
    it=a.begin();
    cit=a.begin();

正确,除了(const T*)不是常量指针外,它是指向const的指针。可能存在性能差异。Const iterator是对编译器的一个提示,因此它可以假定基础对象不会通过迭代器操作进行更改。编译器可以使用这样的提示进行更具体的优化。@WiSaGaN:我认为这不是真的。底层对象可以通过其他方式进行更改,我认为编译器不允许假定底层对象没有更改()。我不确定是否存在性能差异。有时提供常量引用比提供引用便宜得多:在后一种情况下,容器必须能够接受对引用值的修改。特别是在(非STL)写上复制容器中,差异可能很大。同上,跟踪变化的容器。@Michal:是的,的确如此。我在考虑普通STL容器。对于COW容器(或被同化的容器),在获取或取消引用非常量迭代器时,您应该需要花费大量的重复数据消除/状态跟踪成本。我认为OP最感兴趣的是性能方面的差异,并且非常了解
常量迭代器的只读特性。
for( std::vector<int>::const_iterator it = integers.begin() ; it != integers.end() ; ++it )
       { cout << *it << endl; }
list<int>::iterator it; // declare an iterator
    list<int>::const_iterator cit; // declare an const iterator 
    it=a.begin();
    cit=a.begin();
*it=*it+1;//returns no error
    *cit=*cit+1;//this will return error