【问题标题】:implementing an iterator of certain class实现某个类的迭代器
【发布时间】:2023-03-27 15:05:02
【问题描述】:

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

所以我有两个问题:

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

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

【问题讨论】:

  • 我完全不明白你的第二个问题。你能改写一下吗?不过,您通常应该每个问题问一个问题。

标签: c++ types iterator return implementation


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    迭代器本身是一个指向向量持有的值的指针。

    向量迭代器不是指向值的指针,而是一个实现了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 还实现了其他运算符:+, ++, -, --, -&gt;, ==, !=。 此外,vector 还实现了 operator [] 以按索引获取值。

    【讨论】:

    • 如果向量迭代器只是指向元素或类的指针,这真的取决于实现和迭代器类型。
    【解决方案3】:
    1. std::map 的迭代器是一个结构,它引用保存在映射中的键值对。您使用的标准迭代器,即 begin()end() 是双向迭代器。这意味着您可以在迭代器对象上调用 ++i--i 运算符来在地图中保存的项目之间移动/向后移动。
    2. 为什么要实现自己的迭代器?也许创建一个classstruct 将其保存到std::vector&lt;T&gt; 会做你想要的?!您可以通过std::vector&lt;T&gt;::iterator 访问迭代器。如果你真的想实现自己的迭代器,你应该问自己一个问题,它是否应该适用于你自己的数据结构作为测试,或者你是否想与 std data structures 兼容。如果是后者,您应该从迭代器实现派生并按照您的需要对其进行修改。也请看this 的回答。

    【讨论】:

      【解决方案4】:
      1. 取决于实施。通常,std::map 实现为平衡二叉搜索树。在这种情况下,迭代器可能会指向树中的一个节点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-30
        • 2016-10-24
        • 1970-01-01
        • 1970-01-01
        • 2021-11-16
        • 2020-11-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多