代码之家  ›  专栏  ›  技术社区  ›  Frank Puffer

为什么Scott Meyers建议更喜欢“iterator”而不是“const_iterator”`

  •  2
  • Frank Puffer  · 技术社区  · 8 年前

    Scott Meyers在其著作《有效STL》第26项中建议 iterator const_iterator . 据我所知,他主要通过解释来证明这一点 常量迭代器 insert erase .

    但这不是一个 常量迭代器 ,它不允许修改容器?也许更重要的是,它允许您在代码中表达这一意图。

    常量迭代器 默认情况下,仅当需要修改容器时,才使用 迭代器

    2 回复  |  直到 8 年前
        1
  •  4
  •   Community Mohan Dere    5 年前

    简而言之,梅耶斯 const_iterator 在使用STL的最新实现时,由于C++11标准中所做的改进,s更可取。

    常量迭代器 首先,我需要澄清一个误解,并解释是什么改变了。你写道:

    常量迭代器

    这是一个合理的假设,但实际上这并不是 常量迭代器 有效C++ C++11):

    声明 iterator const 常数 T* const 指针):指针 迭代器 不允许指向不同的内容,但它所指向的内容可能会被修改。如果您想要一个迭代器,该迭代器指向无法修改的内容(即 const T* 指针),您需要一个

    简言之 ,它可以防止修改 包含的值 . 这就是Meyers期望 insert 常量迭代器

    erase 常数 活动但请注意,元素的析构函数不是通过迭代器本身调用的;迭代器只是API提供给 具体说明 要删除的项目 常量迭代器 应该能够服务于此目的以及


    现在,关于 以及随后的撤回,我将解释并引用其中的一些内容 关于这件事。在第13项中,“首选 常量迭代器 s至 Meyers写道:

    const_iterators 只有半心半意的支持。创建它们并不是那么容易,一旦你有了一个,你可以使用它的方式是有限的。。。。

    ...没有简单的方法可以获得 常量迭代器 来自非- 常数 容器

    一旦你有了 常量迭代器 s插入(和擦除)的位置只能由指定 迭代器 s 这是不可接受的。

    他举了一个广泛使用 static_cast 为了绕过这些限制,但指出,

    ...我展示的代码可能也无法编译,因为没有从 常量迭代器 迭代器 ,即使有 静态_转换 . 甚至语义大锤也被称为 reinterpret_cast 不能做这项工作。

    他总结道:

    在C++98中,s太麻烦了,几乎不值得这么麻烦。

    这些问题由C++11标准解决。正如在对您的问题的评论中提到的,本标准介绍了 cbegin cend ,返回 无论容器本身是否 常数 insert erase 被赋予过载 常量迭代器 . 这使得 常量迭代器 更易于使用。

        2
  •  3
  •   jpo38    8 年前

    某些版本的insert和erase需要迭代器。如果你想的话 常量和反向迭代器不行

    不可能隐式地将常量迭代器转换为迭代器, const_迭代器既不普遍适用,也不能保证 要有效率。

    但是

    不要误以为这意味着常量迭代器是无用的 一般来说他们不是。它们对算法非常有用, 因为算法通常不关心它们使用哪种迭代器 一起工作只要它们属于适当的类别。常量迭代器 只有一些插入和擦除形式比较挑剔。