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