[英]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;
这也是一个值,它将复制整个列表(将调用复制构造函数或赋值运算符)。 现在list1
和list2
是两个不同的列表实例,修改一个实例不会影响另一个实例。
无论如何,要获得指向列表的指针,您需要以下语法:
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;
}
在这方面,迭代器的行为非常类似于指向元素的指针。 不需要笨拙的next
和hasNext
方法。 您只需将迭代器添加到容器的开头,请确保一旦它指向past-the-end ,就停止迭代,并在要转到下一个元素时将其递增。
正确定义begin
和end
方法的容器也可以在基于范围的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.