【问题标题】:c++ vector and pointers issuec++向量和指针问题
【发布时间】:2014-12-16 22:31:15
【问题描述】:

我有一个问题,结构中的指针在添加到向量时会丢失数据。

在探路者函数中,我创建了一个 vector<Node>,并且对于每个节点,我将 Node.parent 设置为 Node 的地址。

在节点与其父节点一起设置后,我将这些节点弹出到另一个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 值。

任何帮助都会很棒!

【问题讨论】:

  • 这个:setParent(neighbors, &amp;item); 看起来很可疑,就像您正在存储局部变量 item 的地址,这并不好。
  • 使用std::queue&lt;Node&gt;而不是自己滚动怎么样?还要注意Node 的实现,您必须有一个符合Rule-of Three 的实现才能与std::vector&lt;Node&gt;std::queue&lt;Node&gt; 一起使用。
  • 您的队列并不是真正的队列,因为您正在调用push_backpop_back,这意味着您从推送的同一侧弹出,因此您确实有一个堆栈。跨度>

标签: c++ vector path-finding


【解决方案1】:

由于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 也返回一个指针向量,以便它返回原始节点而不是节点的副本。

另外,如果您确实打算将“最新”项推入“队列”,那么您确实有一个堆栈,我会重命名您的变量。

【讨论】:

  • 感谢 b4hand - 我将所有内容重建为指针向量,这很有效。我不认为我的手完全缠在指针上,我想我需要做更多的实验
猜你喜欢
  • 2021-09-10
  • 1970-01-01
  • 2022-06-28
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 2012-06-07
  • 2018-10-02
  • 2011-09-08
相关资源
最近更新 更多