const_iterator 和 iterator 有什么区别?
这两者在 STL 内部的实现方面有什么区别?
性能方面有什么区别?
我想当我们以“只读方式”遍历向量时,我们更喜欢 const_iterator
,对吧?
谢谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
这两者在 STL 内部的实现方面有什么区别?
性能方面有什么区别?
我想当我们以“只读方式”遍历向量时,我们更喜欢 const_iterator
,对吧?
谢谢。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
没有性能差异。
const_iterator 是一个指向 const 值的迭代器(类似于 const T* 指针);取消引用它会返回对常量值 (
const T&
) 的引用并防止修改引用值:它强制执行const
-正确性。当你有一个容器的常量引用时,你只能得到一个
const_iterator
。已编辑:我提到“
const_iterator
返回常量指针”,这是不准确的,感谢 Brandon 指出这一点。编辑:对于 COW 对象,获取非常量迭代器(或取消引用它)可能会触发复制。 (一些过时且现在不允许的
std::string
实现使用 COW。)There is no performance difference.
A
const_iterator
is an iterator that points to const value (like aconst T*
pointer); dereferencing it returns a reference to a constant value (const T&
) and prevents modification of the referenced value: it enforcesconst
-correctness.When you have a const reference to the container, you can only get a
const_iterator
.Edited: I mentionned “The
const_iterator
returns constant pointers” which is not accurate, thanks to Brandon for pointing it out.Edit: For COW objects, getting a non-const iterator (or dereferencing it) will probably trigger the copy. (Some obsolete and now disallowed implementations of
std::string
use COW.)性能方面没有区别。将
const_iterator
置于iterator
之上的唯一目的是管理运行相应迭代器的容器的可访问性。你可以通过一个例子更清楚地理解它:如果我们要阅读 &写入容器的成员,我们将使用迭代器:
如果我们只读取容器的成员
整数
,您可能需要使用 const_iterator,它不允许写入或修改容器的成员。注意:如果您在第二种情况下尝试使用 *it 修改内容,您将收到错误,因为它是只读的。
Performance wise there is no difference. The only purpose of having
const_iterator
overiterator
is to manage the accessesibility of the container on which the respective iterator runs. You can understand it more clearly with an example:If we were to read & write the members of a container we will use iterator:
If we were to only read the members of the container
integers
you might wanna use const_iterator which doesn't allow to write or modify members of container.NOTE: if you try to modify the content using *it in second case you will get an error because its read-only.
如果你有一个列表 a ,然后遵循以下语句,
你可以使用“it”而不是“cit”来更改列表中元素的内容,
也就是说,您可以使用“cit”来读取内容,而不是更新元素。
if you have a list a and then following statements
you can change the contents of the element in the list using “it” but not “cit”,
that is you can use “cit” for reading the contents not for updating the elements.