我正在制作基于Stack
的{{1}}。一切正常,除了我不知道如何为此实现“ range-based for loop”。
我得到了linked-list
。
出什么问题了,我该如何解决?
代码(愚蠢的我在error: no match for ‘operator++’ (operand type is ‘Stack<int>::Node’)
后面重载了++
而不是前缀,现在已全部纠正。):
++
答案 0 :(得分:1)
首先,Stack
完全不可遍历。它应该公开top
,pop
,push
和is_empty
,基本上就是这样。但是,让我们忘记它,并假装要实现常规的链表。
在C ++中,我们使用迭代器的概念来管理容器和算法,以及基于范围的for循环。正式地,为了有资格进行基于范围的for循环,对象需要实现begin()
和end()
成员(或使不合格的begin(x)
和end(x)
调用起作用) ,并且这些方法的结果需要实现operator++
,operator*
和!=
比较。您的Node
类几乎合格,除了它实现了错误类型的operator++
(并且它的逻辑已被破坏,因为它从不更新elem
,但就编译过程而言,形式上是可以的)
标准库中典型的列表类模板实现以类似的方式工作,除了它不直接公开其Node
版本。取而代之的是,它公开了指向节点的指针,该指针被包装在特殊对象中,该对象实现了operator*
和operator++
等许多其他东西。这样可以提供更大的灵活性。
这种行为几乎(或完全类似于)指针的小对象在C ++中称为 iterators 。迭代器在标准库和大量用户代码中无处不在。这是每个C ++程序员都必须尽早学习的非常重要的概念。任何好的C ++书籍或课程都应涵盖它们。
基于迭代器的列表类的片段如下所示:
template <class T> class List {
struct Node {
T elem;
...
};
...
public:
class Iterator {
Node* node;
public:
Iterator operator++() {
node = node->next; return *this;
}
T& operator*() {
return node->elem;
}
...
};
Iterator begin();
Iterator end();
};
建议通过使用公开基于迭代器的接口的标准容器和算法来学习该概念。