gpt4 book ai didi

c++ - 迭代器和STL容器的关系

转载 作者:行者123 更新时间:2023-11-30 04:42:03 27 4
gpt4 key购买 nike

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

来自阅读http://www.cplusplus.com/reference/iterator/iterator/ :

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

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

我的假设是(我将在整个过程中使用 vector 作为示例)

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

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

最佳答案

让我们逐点进行。

Iterators are objects defined with a class template

不一定。迭代器是对象 that have certain operations .指针就是这样的对象,各种类类型的对象也是如此。

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

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

Iterators are classified into five categories depending on the functionality they implement

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

There are different types of iterators (input, output, forward, bidirectional, random access)

那些是 (C++14) 类别,但每个类别中都有无限的类型std::vector<int>::iterator是随机访问迭代器,double * 也是。 ,但它们是不同的类型。这些类别重叠,定义是根据层次结构中以前的类别进行的。 RandomAccess被定义为 Bidirectional 的扩展, 定义为 Forward 的扩展, 定义为 Input 的扩展.

In STL containers, for example vector, the iterator is a nested class template and is created for each unique vector type.

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

An iterator being considered to be one particular type of iterators is just a concept because it ultimately depends on what is implemented as member functions in the vector class.

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

Functions like begin() and end() are overloaded in the vector class

这确实是事实,但可能不是您的意思。每个容器都有两个 名为begin 的成员函数. container::iterator container::begin()container::const_iterator container::begin() const .

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

关于c++ - 迭代器和STL容器的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58951315/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com