【问题标题】:Understanding iterator/const_iterator implementation理解 iterator/const_iterator 的实现
【发布时间】:2020-04-03 08:32:50
【问题描述】:

我知道如何在表面级别上使用迭代器,但我试图了解迭代器是如何与容器类(例如 vector)相关的。

根据 why do we put :: (scope resoulation operator) before iterator?

std::vector 是 std 命名空间中的类模板,这使得 std::vector<double> 成为一个类。

std::vector<T>::iteratorstd::vector<T>下的嵌套类型

据我了解,类模板vector 有一个iterator 类型的成员,它是从#include <iterator> 中的类模板中获取的。

这很令人困惑,因为当我查看 http://www.cplusplus.com/reference/iterator/iterator/ 时,我可以看到 #include <iterator> 中没有 const_iterator 类模板?

【问题讨论】:

  • 它根本没有多大用处,这就是它被弃用的原因:en.cppreference.com/w/cpp/iterator/iterator
  • 某些实现确实使用来自<iterator> 的模板? 您可以查看源代码,例如libstdc++libc++Microsoft's。但我不这么认为;正如 Alan 指出的那样,std::iterator 自 C++17 以来已被弃用。
  • @csguy 不一定。正如我所指出的,它也可能是 pointer-to-value-typetype alias。但是,AFAIK、C++ 标准库实现为容器迭代器定义了自己的类类型。
  • std::vector 的规范中没有任何内容表明 vector::iteratorvector::const_iteratorstd::iterator 有任何特殊关系(即使在 std::iterator 弃用之前的标准中也是如此)。此外,虽然iteratorconst_iterator 是在vector 范围内声明的类型,但不要求vector 具有任一类型的成员——iteratorconst_iterator 是@ 接口的一部分987654350@ 例如成员 begin() 的重载返回这些类型,但没有说明这些函数如何获得它们返回的迭代器。
  • @csguy 需要一个 beginend 函数来返回迭代器(或满足迭代器要求的原始指针)。没有什么说迭代器需要在容器中实现。

标签: c++ iterator


【解决方案1】:

从 cmets 收集的信息:

  • #include <iterator> 中的std::iterator 自 C++17 起已弃用

  • 在它被弃用之前,可能让 STL 容器(由实现定义)在 std::iterator 模板类的帮助下实现迭代器。

  • vector 为例:

    std::vector 的规范中没有说明 vector::iteratorvector::const_iterator 有任何特定的 与std::iterator 的关系(即使在弃用之前的标准中) std::iterator)。此外,虽然 iteratorconst_iterator 是 在vector 范围内声明的类型,没有要求 vector 拥有任一类型的成员 - iteratorconst_iteratorstd::vector 的部分接口例如成员的重载 begin() 返回这些类型,但没有说明这些类型如何 函数获取它们返回的迭代器

  • STL 容器中需要和不需要的是:

    "返回的开始和结束函数 迭代器(或原始指针,因为它满足 迭代器)。没有什么说迭代器需要是 在容器中实现。”

  • STL 容器定义了这些成员类型(iteratorconst_iterator 等),通常使用一些迭代器类别的类型别名,例如 LegacyRandomAccessIterator,其定义为“指向数组元素的指针满足所有要求LegacyRandomAccessIterator"。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2020-01-24
    • 2015-01-16
    • 2011-02-20
    • 1970-01-01
    • 2021-12-29
    相关资源
    最近更新 更多