C++ 基于链表实现堆栈循环的基于范围

C++ 基于链表实现堆栈循环的基于范围,c++,C++,我正在制作一个基于链表的堆栈。除了我不知道如何为这一个实现一个“”之外,一切都很好 我得到了错误:与'operator++'不匹配(操作数类型为'Stack::Node') 出了什么问题,我该如何解决 代码(愚蠢的me重载post++而不是前缀++,现在全部更正): #包括 使用名称空间std; 模板 类堆栈{ 私人: 类节点{ 朋友栈; 公众: void运算符++(){ this->next=this->next->next;//指向下一个节点 } 布尔运算符!=(常量节点和rhs){ 返回

我正在制作一个基于链表的
堆栈
。除了我不知道如何为这一个实现一个“”之外,一切都很好

我得到了
错误:与'operator++'不匹配(操作数类型为'Stack::Node')

出了什么问题,我该如何解决


代码(愚蠢的me重载post++而不是前缀++,现在全部更正):

#包括
使用名称空间std;
模板
类堆栈{
私人:
类节点{
朋友栈;
公众:
void运算符++(){
this->next=this->next->next;//指向下一个节点
}
布尔运算符!=(常量节点和rhs){
返回!(*此==rhs);
}
T算子*(){
返回此->下一步->元素;//返回当前节点元素
}
布尔运算符==(常量节点和rhs){
返回this->next==rhs.next;
}
私人:
元素;
节点*下一步;
};
节点*第一;
内部尺寸;
公众:
堆栈():_大小(0){
第一个=空PTR;
}
无效推送(T项){
Node*n=新节点;
n->elem=项目;
n->next=第一;
第一个=n;
_大小++;
}
T pop(){
T项目=第一->要素;
节点*old_first=first;
第一个=第一个->下一个;
先删除旧的_;
_大小--;
退货项目;
}
int size(){
返回大小;
}
bool empty(){
返回_size==0;
}
节点开始(){
节点n;
n、 下一个=第一个;
返回n;
}
节点结束(){
节点m;
m、 next=nullptr;
返回m;
}
~Stack(){
节点*ele_to_delete;
while(第一个!=nullptr){
ele_to_delete=第一;
第一个=第一个->下一个;
删除ele_至_delete;
}
}
堆栈(const Stack&)=删除;
堆栈和运算符=(常量堆栈-)=删除;
};
int main(){
堆栈ls;
ls.推(1);
ls.推(2);
ls.推(3);
用于(自动s:ls){

cout首先,一个
堆栈根本不应该是可遍历的。它应该公开
top
pop
push
,并且
是空的,基本上就是这样。但是,让我们忘掉它,假装您想要实现一个常规的链接列表

在C++中,我们使用迭代器的概念来管理容器和算法,以及基于循环的范围。正式地,为了满足基于循环的范围,对象需要实现<代码>开始()(代码)>和<代码>结束()/ <代码>成员(或不合格的代码>开始(x)< /C>和<代码>结束(x)< /Cord>调用工作),这些方法的结果需要实现
运算符+++
运算符*
!=
比较。您的
节点
类几乎合格,只是它实现了错误类型的
运算符+
(它的逻辑被破坏了,因为它从不更新
elem
,但从形式上讲,它在编译过程中是正常的)

标准库中的典型列表类模板实现的工作方式类似,只是它不直接公开其版本的
节点
。相反,它公开一个指向节点的指针,封装在一个特殊的对象中,该对象实现了
操作符*
操作符+
以及许多其他功能。这允许使用大量grea更大的灵活性

<> P>这种几乎完全(或完全)像指针的小对象在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();
};
模板类列表{
结构节点{
元素;
...
};
...
公众:
类迭代器{
节点*节点;
公众:
迭代器运算符++(){
node=node->next;返回*this;
}
T&算子*(){
返回节点->元素;
}
...
};
迭代器begin();
迭代器end();
};

建议通过使用公开基于迭代器的接口的标准容器和算法来学习这个概念。

注意\u begin是一个保留标识符,因为有两个下划线。用户代码不应该使用这样的标识符,因为它会导致未定义的行为。通常应使用
list
stack
类如果你想实现自己的作为一个练习,那么熟悉C++所使用的迭代器的概念并在你的实现中使用它。在任何情况下,堆栈只应该执行推、POP、顶部和ISSO空(或计数)。操作。它不应该公开开始、结束、节点或任何与循环相关的范围。但是,列表应该包含所有这些内容。我建议在尝试实现自己的容器之前,先获得一些使用标准容器和迭代器的经验。请不要上传代码图像。它们是对我的babdwidth的无用浪费。谢谢。是的,我做了更正错误的
++
运算符和一些边缘情况后,我将无法工作。谢谢。我将检查
迭代器
。要选择的小骨:您不需要专门化
std:begin
begin
只需由ADL找到。为什么有两个运算符*()具有不同的返回类型?@super-typo,应该是++,已修复。
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();
};