const_iterator 和 iterator 有什么区别?

发布于 2024-10-22 07:40:06 字数 108 浏览 4 评论 0 原文

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

谢谢。

What is difference between these two regarding implementation inside STL.
what is the difference regarding performance?
I guess when we are traversing the vector in "read only wise", we prefer const_iterator, right?

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

冷了相思 2024-10-29 07:40:06

没有性能差异。

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 a const T* pointer); dereferencing it returns a reference to a constant value (const T&) and prevents modification of the referenced value: it enforces const-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.)

行至春深 2024-10-29 07:40:06

性能方面没有区别。将 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; }

如果我们只读取容器的成员整数,您可能需要使用 const_iterator,它不允许写入或修改容器的成员。

for( std::vector<int>::const_iterator it = integers.begin() ; it != integers.end() ; ++it )
       { cout << *it << endl; }

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

Performance wise there is no difference. The only purpose of having const_iterator over iterator is to manage the accessesibility of the container on which the respective iterator runs. You can understand it more clearly with an example:

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

If we were to read & write the members of a container we will use iterator:

for( std::vector<int>::iterator it = integers.begin() ; it != integers.end() ; ++it )
       {*it = 4;  std::cout << *it << std::endl; }

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.

for( std::vector<int>::const_iterator it = integers.begin() ; it != integers.end() ; ++it )
       { cout << *it << endl; }

NOTE: if you try to modify the content using *it in second case you will get an error because its read-only.

走走停停 2024-10-29 07:40:06

如果你有一个列表 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

if you have a list a and then following statements

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

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.

*it=*it+1;//returns no error
    *cit=*cit+1;//this will return error
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文