C++ 向量和指针问题

c++ vector and pointers issue

本文关键字:问题 指针 向量 C++      更新时间:2023-10-16

我遇到了结构中的指针在添加到向量时丢失数据的问题。

在路径查找器函数中,我正在创建一个vector<Node>,对于每个节点,我将Node.parent设置为节点地址。

使用父节点设置节点后,我将这些节点弹出到另一个vector<Node>中。

我遇到的问题是节点在将它们移动到新向量后丢失了指向父节点的指针。

本质上,代码如下所示。

struct Node {
    int x,y;
    Node * parent;
}
vector<Node> queue;
queue.push_back(start)
while (queue.size() > 0) {
    Node item = queue.back(); //grab a item from queue last thing put in
    queue.pop_back(); //remove that item from the queue
    traveled.push_back(item); //add item to list of traveled items.
    std::vector<Node> neighbors = getNeighbors(item);
    setParent(neighbors, &item);
    //check each neighbor
    for (std::vector<Node>::iterator iter = neighbors.begin(); iter != neighbors.end(); iter++) {
        //check if a walkable Node and its not already traveled
        if (validNode(*iter) && !contains(traveled, *iter)) {
            queue.push_back(*iter);
        }
    }
}

一旦我将有效的邻居节点添加回队列向量中,它们就会丢失指向正确父节点的指针。不过,它们确实保留了正确的 x,y 值。

任何帮助都会很棒!

由于 item 是一个局部变量,因此将 item 作为父节点设置其他节点是没有意义的。您可能应该更改queue以存储指向节点的指针,而不是节点本身:

std::vector<Node *> stack;
stack.push_back(&start);
while (!stack.empty()) {
    Node *item = stack.back();
    stack.pop_back();
    traveled.push_back(item);
    std::vector<Node *> neighbors = getNeighbors(item);
    // ...
}

问题是您设置父级的指针稍后无效。这并不是说指针丢失了,而是它们指向堆栈上稍后将被覆盖的项目。出于同样的原因,您可能还希望getNeighbors返回指针向量,以便它返回原始节点而不是节点的副本。

另外,如果您确实打算将"最新"项目推送到"队列"上,那么您确实有一个堆栈,我会将您的变量重命名为这样。