实现循环列表的迭代器
Implement iterator of a circular list
我正在尝试使用嵌套的 class 迭代器实现循环列表的 class,我这样写:
template <class T>
class CircularList {
struct Item {
T data;
Item* next;
};
Item* head;
int size;
public:
CircularList() {
head = new Item();
head->next = head;
}
int sizeList() { return size; }
void push(T data) {
Item* i = new Item();
i->data = data;
i->next = head->next;
head->next = i;
size++;
}
class CircularListIterator {
Item* p;
CircularListIterator() {
p = head->next;
}
bool hasNext() {
if(p->next != head) {
return true;
}
return false;
}
T next() {
T data_temp = p->data;
p = p->next;
return data_temp;
}
};
CircularListIterator* iterator() {
return new CircularListIterator();
}
};
int main() {
CircularList<string>* letters = new CircularList<string>;
letters->push("d");
letters->push("c");
letters->push("b");
letters->push("a");
Iterator<string>* it= new Iterator<string>;
it = letters->iterator();
while (it->hasNext()) {
cout<< it->next() << "," << endl;
}
return 0;
}
但是当我尝试在主函数中创建迭代器时迭代器不工作,它说它没有在范围内声明并且没有它的成员。
假设“in the main class”是指在 main
function 中,问题非常简单:您正在尝试构建::Iterator<string>
,但全局命名空间(或此代码示例中的其他任何地方)中没有名为 Iterator
的 class!您可以尝试构造一个 CircularList<string>::CircularListIterator
- 至少存在一个 class - 但它不起作用,因为迭代器需要与 CircularList
对象相关联才能访问成员变量,如 head
.
这里正确的做法是提升 iterator
功能 - return 是 CircularListIterator*
的功能 - 在 CircularListIterator
class 之外并进入 CircularList
class。然后,在您的 main
函数中,您可以调用 letters->iterator()
并且它将 return 一个 CircularListIterator*
用于 letters
对象。
现在,CircularListIterator
不会继承自任何其他迭代器 classes - 您输入的(不存在于此代码 Iterator
it
作为,也不是 C++ std::iterator
或其任何变体)-因此您不能将其分配给 it
,甚至可能编译引用 Iterator
的代码。要使 CircularListIterator
成为 std::iterator
的子 class,您需要使用适当的类别扩展 std::iterator<Category, T>
。有关 std::iterator
class 模板的更多信息,包括实施它的示例,请参阅 https://www.cplusplus.com/reference/iterator/iterator/。
我正在尝试使用嵌套的 class 迭代器实现循环列表的 class,我这样写:
template <class T>
class CircularList {
struct Item {
T data;
Item* next;
};
Item* head;
int size;
public:
CircularList() {
head = new Item();
head->next = head;
}
int sizeList() { return size; }
void push(T data) {
Item* i = new Item();
i->data = data;
i->next = head->next;
head->next = i;
size++;
}
class CircularListIterator {
Item* p;
CircularListIterator() {
p = head->next;
}
bool hasNext() {
if(p->next != head) {
return true;
}
return false;
}
T next() {
T data_temp = p->data;
p = p->next;
return data_temp;
}
};
CircularListIterator* iterator() {
return new CircularListIterator();
}
};
int main() {
CircularList<string>* letters = new CircularList<string>;
letters->push("d");
letters->push("c");
letters->push("b");
letters->push("a");
Iterator<string>* it= new Iterator<string>;
it = letters->iterator();
while (it->hasNext()) {
cout<< it->next() << "," << endl;
}
return 0;
}
但是当我尝试在主函数中创建迭代器时迭代器不工作,它说它没有在范围内声明并且没有它的成员。
假设“in the main class”是指在 main
function 中,问题非常简单:您正在尝试构建::Iterator<string>
,但全局命名空间(或此代码示例中的其他任何地方)中没有名为 Iterator
的 class!您可以尝试构造一个 CircularList<string>::CircularListIterator
- 至少存在一个 class - 但它不起作用,因为迭代器需要与 CircularList
对象相关联才能访问成员变量,如 head
.
这里正确的做法是提升 iterator
功能 - return 是 CircularListIterator*
的功能 - 在 CircularListIterator
class 之外并进入 CircularList
class。然后,在您的 main
函数中,您可以调用 letters->iterator()
并且它将 return 一个 CircularListIterator*
用于 letters
对象。
现在,CircularListIterator
不会继承自任何其他迭代器 classes - 您输入的(不存在于此代码 Iterator
it
作为,也不是 C++ std::iterator
或其任何变体)-因此您不能将其分配给 it
,甚至可能编译引用 Iterator
的代码。要使 CircularListIterator
成为 std::iterator
的子 class,您需要使用适当的类别扩展 std::iterator<Category, T>
。有关 std::iterator
class 模板的更多信息,包括实施它的示例,请参阅 https://www.cplusplus.com/reference/iterator/iterator/。