实现某个类的迭代器

implementing an iterator of certain class

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

当创建向量的迭代器时,迭代器本身是指向向量所包含值的指针。因此*迭代器实际上是向量所持有的值。

所以我有两个问题:

  1. 在地图上使用迭代器时,迭代器实际上是什么?我的意思是,它的内部实现是什么?它是否像一个包含不同数据成员的结构?

  2. 如果我想实现我自己的迭代器,它包含几个数据成员,那么在创建迭代器时,我实际返回的是什么?

  1. 取决于实施。通常,std::map被实现为一个平衡的二进制搜索树。在这种情况下,迭代器可能会指向树中的一个节点
  1. std::map的迭代器是一个引用映射中保存的键值对的结构。使用begin()end()得到的标准迭代器是双向迭代器。这意味着您可以在迭代器对象上调用++i--i运算符,以便在映射中保存的项之间来回移动
  2. 为什么要实现自己的迭代器?也许创建一个classstruct并将其保存到std::vector<T>会达到您想要的效果?!您可以通过std::vector<T>::iterator访问迭代器。如果你真的想实现自己的迭代器,你应该问问自己,它是否应该作为测试适用于你自己的数据结构,或者你是否想与std data structures兼容。如果是后者,则应该从迭代器实现派生,并根据需要对其进行修改。看看这个答案

迭代器本身是指向向量所包含值的指针。

向量迭代器不是一个指向值的指针,而是一个实现了operator *的类,它返回由容器持有并由迭代器指出的值。如果是映射,您可以使用firstsecond字段访问密钥和值:

map<string, int> wheelMap;
wheelMap["Car"] = 4;
map<string, int>::iterator itWheel = wheelMap.begin();
cout << itWheel ->first << ":" << itWheel ->second << endl;  //This will print: Car:4

Map iterator还实现了其他运算符:+, ++, -, --, ->, ==, !=。此外,CCD_ 18还实现了CCD_。

我将类似std::map的容器实现为红黑树(就像std::map实现中经常使用的位置一样),迭代器实现只需要指向树节点的指针(常量和非常量版本)。每个树节点都包含指向两个子节点和父节点的指针(加上颜色位),这足以将树遍历到任意一个方向。一般来说,它取决于容器&迭代器类型(和实现),以及实现其功能所需的数据类型。例如,我的deque迭代器有指向元素的容器和索引的指针,但迭代器的实现方式以及它们需要什么数据实际上取决于实现。