【问题标题】:how to make array of nodes?如何制作节点数组?
【发布时间】:2013-04-29 19:01:59
【问题描述】:

我对指针和数组有一点误解。 当我想创建一个节点数组时,我需要一个指针吗?

是吗

Node* array;
array = new Node[size];

当然问题是我想将节点分配到数组中时

void Class::enqueue(int newNum)
{

    Node* newNode = new Node();
    newNode->value = newNum;
    newNode->age = 0;

    if (isFull())
        resize();
    top++;
    array[top] = newNode; // ERROR. does this have to be a pointer?
}   

newNode 是一个指针,我理解。但是如果我想动态分配一个节点,那么我将不得不使用一个指针。如果是这种情况,那么我将如何将节点分配到数组中? 谢谢。

【问题讨论】:

  • 为什么不简单地std::vector<Node>??你真的需要指针和动态分配的指针吗?

标签: c++ arrays heap-memory


【解决方案1】:

你说你想要一个节点数组,但看起来你真正想要的是一个指向节点的指针数组。您的代码中的 newNode 是一个指针,因此该数组应该能够保存 Node 的指针。将您的数组定义为:

Node** array;
array = new (Node*)[size];

记住在不再需要时释放内存:

delete []array;

你也可以使用Node的数组:

Node* array;
array = new Node[size];

...
Node *newNode = new Node();
...
array[top] = *newNode; // dereference the pointer

但您应该小心,因为这样节点的内容将被复制到数组单元格。然后会有两个独立的对象,持有相同的数据。您不能使用数组的内容来操作原始节点。

我猜你真的需要一个指向节点的指针数组:)(或者如比尔所说,一个指针向量:vector<Node*> v;

【讨论】:

  • 我实际上想要一个节点数组,而不是指向节点的指针数组。如果我需要动态分配的内存来创建新节点,我会遇到麻烦。如果我需要动态分配的内存,我需要一个指针,对吗?之前谢谢。
  • 如果您希望能够访问您动态创建的原始节点,则必须使用指针数组。查看我的编辑。
  • 谢谢你回答了我的问题。
  • 如果您不介意回答进一步澄清,那么 delete [] 数组在这一点上有什么作用?它会删除动态分配的数组以及节点吗?谢谢
  • @Leonard 不客气。不,它只是删除分配给new [] 数组的内存,因为数组的内容是指针。是new []的逆运算。如果将数组定义为Node *array = new Node[size];,则 new 运算符会分配足够的内存来保存节点本身,然后为每个节点调用构造函数。在这种情况下,delete [] 反转该操作并为每个节点调用析构函数,然后将它们全部删除。
【解决方案2】:
Node* array;

创建Node的数组,它将存储Node的对象,如

int* array;

创建一个存储整数的数组。然而,

Node* newNode = new Node(); 

new 返回一个指向Node 对象的指针,即newNode,当您尝试将指针放入需要Node 对象的Node 时,您会收到该错误。

假设您的Node 类/结构有valueage 成员,您可以执行以下操作:

Node newNode(newNum, 0); //^^call your Node's constructor that takes 2 params
array[top] = newNode;

Node 的对象放入Node 的数组中。您也可以使用 STL 容器来避免使用动态数组。

【讨论】:

  • 我明白了。我实际上是在尝试创建一个节点数组,而不是指针节点数组。当动态分配用于创建节点时,如何将节点分配到数组中?谢谢
【解决方案3】:

如果你可以使用std::vector,你可以使用std::vector<Node*> myvector;(如果你真的想要指针)

那你可以做myvector.push_back(new Node(...));不要忘记删除内存,否则会出现内存泄漏,

如果您不关心指针,只需使用以下内容(更干净,无需手动释放内存)

std::vector<Node> myvector;
Node node;
myvector.push_back(node);

【讨论】:

  • 我认为我可以使用 STL,但我从未尝试过使用它。我将阅读使用 STL 的文档
  • 祝你好运!并阅读arraysvectors 之间的差异——只是一个例子——cplusplus.com/forum/beginner/6321
猜你喜欢
  • 2015-03-18
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
相关资源
最近更新 更多