Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 迭代器与STL容器的关系_C++_Iterator - Fatal编程技术网

C++ 迭代器与STL容器的关系

C++ 迭代器与STL容器的关系,c++,iterator,C++,Iterator,我理解迭代器背后的一般思想,我可以在基本层面上使用迭代器,但我不知道在引擎盖下会发生什么,以及迭代器与STL容器之间的关系 阅读: 迭代器是用类模板定义的对象 “迭代器根据其实现的功能分为五类” 有不同类型的迭代器(输入、输出、前向、双向、随机访问) 我的假设是(我将始终使用向量作为示例) 在STL容器中,例如vector,迭代器是一个嵌套类模板,为每个唯一的vector类型创建 迭代器被认为是一种特殊类型的迭代器,这只是一个概念,因为它最终取决于vector类中作为成员函数实现的内容。

我理解迭代器背后的一般思想,我可以在基本层面上使用迭代器,但我不知道在引擎盖下会发生什么,以及迭代器与STL容器之间的关系

阅读:

  • 迭代器是用类模板定义的对象
  • “迭代器根据其实现的功能分为五类”

  • 有不同类型的迭代器(输入、输出、前向、双向、随机访问)

我的假设是(我将始终使用
向量
作为示例)

  • 在STL容器中,例如
    vector
    ,迭代器是一个嵌套类模板,为每个唯一的
    vector
    类型创建
  • 迭代器被认为是一种特殊类型的迭代器,这只是一个概念,因为它最终取决于
    vector
    类中作为成员函数实现的内容。
    • 我的推理是,例如:
      std::list::iterator iterator
      是一个双向迭代器vs
      std::vector::iterator迭代器
      是一个随机访问迭代器,都是用
      ::iterator
      声明的,没有区别
  • begin()
    end()
    这样的函数在
    vector
    类中重载

我希望我说的有道理,请纠正我。

让我们一点一点地说

迭代器是用类模板定义的对象

不一定。迭代器是对象。指针是这样的对象,各种类类型的对象也是这样

每个容器定义一个成员类型
container::iterator
,以及另一个成员类型
container::const_iterator

这些类型可以是直接的(嵌套类),也可以是引用其他类型名的类型别名

迭代器根据其实现的功能分为五类

从C++14开始,是的。C++17和C++20分别引入了另一个类别

有不同类型的迭代器(输入、输出、前向、双向、随机访问)

这些是(C++14)类别,但每个类别中都有无限的类型
std::vector::iterator
是一个随机访问迭代器,
double*
也是一个随机访问迭代器,但它们是不同的类型。这些类别相互重叠,定义与等级体系中以前的定义相同。被定义为的扩展,被定义为的扩展,被定义为的扩展

在STL容器中,例如
向量
迭代器
是一个嵌套的类模板,为每个唯一的向量类型创建

大部分。在许多实现中确实如此,但在
std::vector
的特定情况下,没有规则阻止实现将
T*
用作
迭代器类型

迭代器被认为是一种特殊类型的迭代器,这只是一个概念,因为它最终取决于向量类中作为成员函数实现的内容

对。C++有一个概念概念,它只是对以相似方式进行行为的事物的标签。由于模板的工作方式,满足特定概念的类型之间不需要存在任何关系。对比Java和C#,在类型定义中必须明确提到
接口
s

像begin()和end()这样的函数在vector类中重载

这是真的,但可能不是你的意思。每个容器都有两个名为
begin
的成员函数
container::iterator container::begin()
container::const\u iterator container::begin()const


还有免费函数模板,专门用于每个容器和(C样式)数组。

begin()
end()
本身没有重载,因为
std::vector
本身没有基类。
std::vector
的迭代器类型由实现定义。它不需要是嵌套类模板,它可能只是指向值类型(
T*
)的指针的别名
begin
end
是成员函数;为什么超载?第一个要点已经有误导性了。迭代器可以被认为是概念,可以由类或类模板实现,也可以不由类模板实现。但您从中获得信息的参考似乎是在谈论
std::iterator
@csguy对,就是这样!例如,指针是随机访问迭代器。@ CSGADE C++标准基本上定义了容器的API和对它们行为的一些要求。只要满足这些条件,实现细节就留给Statnard库的特定实现。查看的源代码,例如,或。它们都以自己的方式实现容器(源代码)。