实现基于链表的堆栈的基于范围的 for 循环
Implement range-based for loop of a Stack based on linked-list
我正在制作一个基于linked-list
的Stack
。一切都很好,除了我不知道如何为此实现"基于范围的 for 循环"。
我得到了error: no match for ‘operator++’ (operand type is ‘Stack<int>::Node’)
.
出了什么问题,我该如何解决?
代码(愚蠢的我重载帖子++
不前缀++
,现在全部更正。
#include <iostream>
using namespace std;
template<typename T>
class Stack{
private:
class Node{
friend Stack;
public:
void operator++(){
this->next = this->next->next; //point to next Node
}
bool operator!=(const Node& rhs){
return !(*this == rhs);
}
T operator*(){
return this->next->elem; //return current Node elem
}
bool operator==(const Node& rhs){
return this->next == rhs.next;
}
private:
T elem;
Node* next;
};
Node* first;
int _size;
public:
Stack():_size(0){
first = nullptr;
}
void push(T item){
Node* n = new Node;
n->elem = item;
n->next = first;
first = n;
_size++;
}
T pop(){
T item = first->elem;
Node* old_first = first;
first = first->next;
delete old_first;
_size--;
return item;
}
int size(){
return _size;
}
bool empty(){
return _size == 0;
}
Node begin(){
Node n;
n.next = first;
return n;
}
Node end(){
Node m;
m.next = nullptr;
return m;
}
~Stack(){
Node* ele_to_delete;
while(first != nullptr){
ele_to_delete = first;
first = first->next;
delete ele_to_delete;
}
}
Stack(const Stack&) = delete;
Stack& operator=(const Stack&) = delete;
};
int main(){
Stack<int> ls;
ls.push(1);
ls.push(2);
ls.push(3);
for(auto s: ls){
cout << s << "|";
}
return 0;
}
首先,Stack
根本不应该是可遍历的。它应该公开top
、pop
、push
和is_empty
,基本上就是这样。但是让我们忘记它,假装你想实现一个常规的链表。
在C++我们使用迭代器的概念来管理容器和算法,以及基于范围的 for 循环。形式上,为了符合基于范围的 for 循环,对象需要实现begin()
和end()
成员(或使非限定begin(x)
和end(x)
调用工作(,并且这些方法的结果需要实现operator++
、operator*
和!=
比较。你的Node
类几乎是合格的,除了它实现了错误的operator++
(它的逻辑被破坏了,因为它从不更新elem
,但正式地就编译而言是可以的(。
标准库中的典型列表类模板实现的工作方式类似,只是它不直接公开其Node
版本。相反,它公开了一个指向节点的指针,该指针包装在一个实现operator*
和operator++
以及许多其他事情的特殊对象中。这提供了更大的灵活性。
这种行为几乎(或完全(像指针的小对象在C++中称为迭代器。迭代器在整个标准库和大量用户代码中无处不在。这是一个非常重要的概念,每个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();
};
建议通过使用公开基于迭代器的接口的标准容器和算法来学习该概念。
- 在基于范围的for循环中使用结构化绑定声明
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 基于范围的 for 循环unordered_map和引用
- C++基于范围的 for 循环和元素副本
- 实现基于链表的堆栈的基于范围的 for 循环
- 在基于范围的 for 循环期间插入 std::list 的后面
- 基于范围的 for 循环range_declaration中各种说明符之间的性能差异
- 避免在基于反向范围的for循环实现中悬挂参考
- C++ - 使用基于范围的 for 循环将字符值分配给向量中的字符串不会分配值
- 转到基于范围的 for 循环中的下一个迭代器
- 使用基于数组和范围的 For 循环替换一些基本代码行
- C++:返回一个基于范围 for 循环迭代器,其中包含继承对象
- 布尔值向量的基于范围 for 循环
- 在 c++ 中基于范围的 for 循环中使用引用作为控制变量
- C++11 基于范围的 for 循环,用于 std::list
- 堆分配数组的基于范围的 for 循环
- 关于在向量向量上使用基于范围的 for 循环
- 如何使用基于范围的for循环迭代Rapidjson文档(它本身就是一个JSON数组)
- 使用基于范围的for循环取消对矢量指针的引用