【发布时间】: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>::iterator是std::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-type 的 type alias。但是,AFAIK、C++ 标准库实现为容器迭代器定义了自己的类类型。
-
std::vector的规范中没有任何内容表明vector::iterator或vector::const_iterator与std::iterator有任何特殊关系(即使在std::iterator弃用之前的标准中也是如此)。此外,虽然iterator和const_iterator是在vector范围内声明的类型,但不要求vector具有任一类型的成员——iterator和const_iterator是@ 接口的一部分987654350@ 例如成员begin()的重载返回这些类型,但没有说明这些函数如何获得它们返回的迭代器。 -
@csguy 需要一个
begin和end函数来返回迭代器(或满足迭代器要求的原始指针)。没有什么说迭代器需要在容器中实现。