【问题标题】:The question on iterator begin() function关于迭代器 begin() 函数的问题
【发布时间】:2020-01-12 06:59:15
【问题描述】:

在链接下方,我看到了迭代器开始函数的工作原理,但不清楚。

https://secweb.cs.odu.edu/~zeil/cs361/web/website/Lectures/iterators/pages/implem.html

在他们中,我看到了 begin 功能,但不明白它是如何工作的

  Book::iterator Book::begin()
  {
   Book::iterator it;
   it->pos = authors;
    return it;
  };

在这个it 中是对象,但在这个it-> 中,我认为这是在做什么? operator->() 我认为它像 it.operator->().pos 一样工作,但我不确定 在那之后为什么它返回it 我的问题是return it 是什么我没有得到清晰的图片。

【问题讨论】:

  • 这段代码能编译吗?我找不到Book::iterator 的类规范,所以我不知道Book::iterator 的成员访问运算符做了什么。没有Book::iterator::operator->() 的代码,就无法知道。
  • 在本书类中声明
  • -> 是类成员引用运算符,将it->pos 初始化为AuthorListNode* authors; 中的第一个节点(因此您的begin() 迭代器返回一个指向第一个节点的pos 指针在列表中。)
  • @AbhiSarkar 也许我是盲人,但我仍然看不到Book::iterator::operator->() 的定义位置。

标签: c++ iterator


【解决方案1】:

我很确定这是一个错误,它应该只是it.pos = authors,因为它试图设置迭代器的值而不是取消引用迭代器(它没有初始化,所以可能会崩溃)并设置一个值指向的节点。

【讨论】:

    【解决方案2】:

    您的class Book 包含一个struct AuthorListNode 和一个指向struct AuthorListNode 类型的指针,该指针用作指向链表中开始节点的指针:

    class Book {
      struct AuthorListNode {
         Author data;
         AuthorListNode* next;
      };
      ...
    private:
      ...
      AuthorListNode* authors;  // linked list of pointers to authors
      ...
    };
    

    Book::iterator Book::begin() 的迭代器中,it->pos = authors; 将迭代器 itpos 成员设置为链表的开头,返回指针 it,其中 pos 成员初始化为指向链表的开头允许您从 authors 的开头进行迭代。

    (注意:AuthorIterator::pointer AuthorIterator::operator->() 具有 return &(pos->data);,因此 &AlanBirtles 在他的回答中使用 it->pos 标识很可能是文档中的错误)

    【讨论】:

    • David C.Rankin 你能参考一些网站或教程,我可以从中学习迭代器完整教程
    • 我实际上是在阅读您的课程大纲,它很好地描述了迭代器集成。我会使用你的指南和 StackOverflow 页面 How to implement an STL-style iterator and avoid common pitfalls? 来让一个简单的迭代器工作,你可以将你学到的东西应用到其余部分。
    • David C.Rankin 实际上这个资源是我从互联网上获得的。
    • @AbhiSarkar -> 是您的实施中的错误。我从您的文档中编写了一个简短的迭代器实现,您确实需要it.pos 而不是it->pos,请参阅Class Iterator。鉴于您引用的多个链接上的多个 typedef,目前还不清楚,但 Book::iterator it; 确实只是声明了一个 Book::iterator 的实例,而不是指向正确的 int.pos 的指针。
    猜你喜欢
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多