迭代器和 STL 容器的关系

Relationship of iterators and STL containers

本文关键字:关系 STL 迭代器      更新时间:2023-10-16

我了解迭代器背后的一般思想,我可以在基本级别使用它们,但我不明白引擎盖下发生了什么以及它们与 STL 容器的关系。

从阅读 http://www.cplusplus.com/reference/iterator/iterator/:

  • 迭代器是使用类模板定义的对象
  • "迭代器根据它们实现的功能分为五类">

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

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

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

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

让我们逐点进行。

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

不一定。迭代器是具有特定操作的对象。指针是这样的对象,各种类类型的对象也是如此。

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

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

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

截至 C++14,是的。C++17和C++20分别引入了另一个类别。

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

这些是(C++14)类别,但每个类别中都有无限种类型std::vector<int>::iterator是随机访问迭代器,double *也是如此,但它们是不同的类型。这些类别重叠,定义是根据层次结构中的先前定义。RandomAccess

被定义为双向的扩展,双向被定义为向前的扩展,向前被定义为输入的扩展。

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

主要。在许多实现中确实如此,但是在std::vector<T>的特殊情况下,没有规则阻止实现使用T *作为iterator类型。

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

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

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

从字面上看,这是真的,但可能不是你的意思。每个容器都有一个名为begin的成员函数。container::iterator container::begin()container::const_iterator container::begin() const.

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