【发布时间】: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, &item);看起来很可疑,就像您正在存储局部变量item的地址,这并不好。 -
使用
std::queue<Node>而不是自己滚动怎么样?还要注意Node的实现,您必须有一个符合Rule-of Three 的实现才能与std::vector<Node>或std::queue<Node>一起使用。 -
您的队列并不是真正的队列,因为您正在调用
push_back和pop_back,这意味着您从推送的同一侧弹出,因此您确实有一个堆栈。跨度>
标签: c++ vector path-finding