繁体   English   中英

外部双链表迭代器c ++

[英]External Doubly Linked-list Iterator c++

我做了一个双向链表。 在我的主体中,我需要使用一个外部List Iterator,它具有一个接受列表的构造函数。 这是我到目前为止的内容:

struct ListIterator : List {
    Node* cur = head;

    ListIterator(List* list) {
        this -> list = list;
    }

    bool hasNext() {
        return (cur -> next) != nullptr;
    }

    int next() {
        return list.at(cur -> next);
    }
};

这是我的主要:

List list1;

list1.append('I');
list1.append('D');
list1.append('F');
list1.append('G');
ListIterator it(list1);

while (it.hasNext()) {
   cout << it.next();
}

如您所见,我正在尝试使用hasNext()和next()来显示列表中的所有节点。 我对如何创建一个接受列表并在ListIterator struct中使用该函数的构造方法感到困惑。 任何提示和暗示将不胜感激。

您似乎深受Java(甚至C#)的影响。 这不是一件坏事,您只需要学习C ++的来龙去脉。

第一个问题是:在C ++中,值,引用和指针之间有明显的区别。 当您声明List类的实例时,如下所示:

List list1;

这实际上是一个价值。 该实例存在于堆栈中,并且在范围结束时将被适当地处置(将调用析构函数)。

如果现在要初始化第二个列表,如下所示:

List list2 = list1;

这也是一个值,它将复制整个列表(将调用复制构造函数或赋值运算符)。 现在list1list2是两个不同的列表实例,修改一个实例不会影响另一个实例。

无论如何,要获得指向列表的指针,您需要以下语法:

List *listPtr1 = &list1;

由于它是一个指针,因此进行间接复制将不会复制基础结构:

List *listPtr2 = listPtr1; // Will also point to list1

虽然使用正确的语法可以解决您的直接问题,但不能正确解决奇数迭代器的实现。

在C ++中,迭代器要么指向容器中的单个元素,要么指向过去 迭代器通常不知道容器自身是否到达了容器的末端。 相反,需要将其与该过去的迭代器进行比较。

容器通常定义一个begin方法,该方法将迭代器返回到第一个元素,一个end方法,将迭代器返回给past-the-end

通常使用以下原型在容器上进行迭代:

for (auto it = container.begin(); it != container.end(); ++it)
{
    // To access the element, you need to dereference the iterator:
    std::cout << "The current value is :" << *it << std::endl;
}

在这方面,迭代器的行为非常类似于指向元素的指针。 不需要笨拙的nexthasNext方法。 您只需将迭代器添加到容器的开头,请确保一旦它指向past-the-end ,就停止迭代,并在要转到下一个元素时将其递增。

正确定义beginend方法的容器也可以在基于范围的for循环中使用

for (auto &element : container)
{
    std::cout << "The current value is :" << element << std::endl;
}

我知道实现自己的容器很有趣而且很有教育意义。 我重新发明了相当多的轮子,只是为了了解事情是如何工作的,所以这没有错。 但是我建议您也许首先使用标准C ++容器,掌握C ++与Java和C#等语言之间的主要区别,然后再进行练习。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM