C++ 为什么使用双指针创建队列?

C++ 为什么使用双指针创建队列?,c++,pointers,C++,Pointers,我有两个类节点和队列。在队列构造函数中,我们需要在堆中创建Node类型的数组。我的问题是,为什么我们应该使用双指针节点**Q,然后像这样创建一个数组Q=new Node*[size],而我们本可以用一个指针创建一个节点数组?like Node*Q和Q=新节点[大小] 首先,让我们明确一下,我们正在研究两种不同的数据结构: 二叉树,由节点对象定义。 由固定大小的缓冲区支持的队列可能是环形缓冲区。 还有一种算法使用这些数据结构。基于其中一条注释,该算法从排队的节点构建二叉树。换句话说,该算法想要修改

我有两个类节点和队列。在队列构造函数中,我们需要在堆中创建Node类型的数组。我的问题是,为什么我们应该使用双指针节点**Q,然后像这样创建一个数组Q=new Node*[size],而我们本可以用一个指针创建一个节点数组?like Node*Q和Q=新节点[大小]


首先,让我们明确一下,我们正在研究两种不同的数据结构:

二叉树,由节点对象定义。 由固定大小的缓冲区支持的队列可能是环形缓冲区。 还有一种算法使用这些数据结构。基于其中一条注释,该算法从排队的节点构建二叉树。换句话说,该算法想要修改原始节点对象-它不想修改它们的副本


因此,分配Node*数组的原因是队列不必复制节点对象。相反,进入队列的指针与随后退出队列的指针完全相同。这允许链接算法在原始节点上运行,从而达到预期效果。

因为此代码是由一名Java程序员编写的,他没有意识到除了指针之外还有其他东西存在。看起来编写者希望他们的队列是一个二叉树数组。我认为你应该找一个不同的例子来学习。这个人要么是在解决一个非常有趣的问题,要么是疯了。“KeaveNevand DeLulde不使用Neo永远是我觉得告诉C++学习者是合适的事情之一。就像我们对学生说永远不要使用goto,然后我们都会在一百万种情况下遇到1,在这种情况下,goto实际上是有意义的。@agastyateja智能指针unique_ptr或shared_ptr,通常应用于拥有堆中的内存,而引用&应用于借用您不拥有的数据。除非你有很好的理由这样做,否则用new手动管理内存是很容易出错和过时的。如果您分配了一些您自己拥有的内容,并且您负责使用delete释放该内存,如。在非平凡的程序中,这可能变得非常棘手和复杂。如果你避免使用新的,而是使用引用,便宜的副本,像std::unique_ptr这样的指针包装器,它会极大地简化你的代码。我真的不能说,因为我不知道这是用于什么算法,或者你需要什么样的二叉树:但归根结底,这是教育性的代码,至少我认为是这样的,所以重要的是你要了解发生了什么。在现实世界中,您不太可能实现自己的树或队列,而是使用标准实用程序,例如FIFO队列,或者通常是树。
   class Node
    {
    public:
     Node *lchild;
     int data;
     Node *rchild;
    };

class Queue {
private:
 int front;
 int rear;
 int size;
 Node **Q;
public:
 Queue(){front=rear=-1;size=10;Q=new Node*[size];}
 Queue(int size){front=rear=-1;this->size=size;;Q=new
Node*[size];}
 void enqueue(Node *x);
 Node *dequeue();
 int isEmpty(){ return front==rear;}
};