gpt4 book ai didi

c++ - 为什么 Scott Meyers 建议更喜欢 `iterator` 而不是 `const_iterator`

转载 作者:搜寻专家 更新时间:2023-10-31 00:08:58 25 4
gpt4 key购买 nike

在他的 Effective STL 一书的第 26 项中,Scott Meyers 建议优先使用 iterator 而不是 const_iterator。据我了解,他主要通过解释 const_iterator 不适用于某些函数,如 inserterase 来证明这一点。

但这不是 const_iterator 的全部意义,它不允许修改容器吗?也许更重要的是,它允许您在代码中表达这种意图。

难道他不应该建议默认使用 const_iterator 并且只有在需要修改容器时才使用 iterator 吗?

最佳答案

简短的回答是,由于 C++11 中的改进,Meyers 确实在使用 STL 的最新实现时考虑了 const_iterator标准。

不过,在首先讨论他给出反const_iterator 建议的原因并解释发生了什么变化之前,我需要澄清一个误解。你写:

isn't that the whole point of a const_iterator, that it does not allow modifying the container?

这是一个合理的假设,但实际上这并不完全是 const_iterator 的目的。正如 Meyers 在 Effective C++ 第三版中解释的那样(值得注意的是, C++11 之前):

Declaring an iterator const is like declaring a pointer const (i.e., declaring a T* const pointer): the iterator isn't allowed to point to something different, but the thing it points to may be modified. If you want an iterator that points to something that can't be modified (i.e., the STL analogue of a const T* pointer), you want a const_iterator[.]

简而言之,const_iterator 不防止修改容器,它防止修改包含的值。这就是 Meyers 期望 insertconst_iterator 兼容的原因:它不会修改容器中已经存在的任何元素。

erase 有点奇怪,因为它导致包含的元素被销毁,这是一个非const 操作。但请注意,元素的析构函数不是通过迭代器本身调用的;迭代器只是 API 提供的方法,用于指定删除的项目。从语义上讲,const_iterator 应该和 iterator 一样能够达到这个目的。


现在,关于 Effective STL 中的建议及其随后的撤回,我将解释并引用 Effective Modern C++ 中的一些内容。在第 13 项“更喜欢 const_iterator 而不是 iterator”中,Meyers 写道:

...in C++98, const_iterators had only halfhearted support. It wasn't that easy to create them, and once you had one, the ways you could use it were limited....

...there was no simple way to get a const_iterator from a non-const container...

Once you had the const_iterators...locations for insertions (and erasures) could be specified only by iterators. const_iterators weren't acceptable.

他给出了一个广泛使用 static_cast 来绕过这些限制的例子,但指出,

...the code I've shown might not compile, either, because there's no portable conversion from a const_iterator to an iterator, not even with a static_cast. Even the semantic sledgehammer known as reinterpret_cast can't do the job.

他总结道:

...const_iterators were so much trouble in C++98, they were rarely worth the bother.

C++11 标准解决了这些问题。正如在对您的问题的评论中提到的,该标准引入了 cbegincend,无论容器本身是否为 ,它们都会返回 const_iterator >常数。另外,inserterase被赋予采用 const_iterator 的重载。这使得 const_iterator 更易于使用。

关于c++ - 为什么 Scott Meyers 建议更喜欢 `iterator` 而不是 `const_iterator`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45824885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com