这是一个来自我正在开展的大型计划的快速示例程序。这并不完美,但它传达了我所拥有的问题
#include <iostream>
#include <vector>
using namespace std;
class Node {
public:
vector<int> state;
Node *parent; //Parent node
//Initial Node
Node(const vector<int> &s) : state(s) {}
//Other Nodes
Node(const vector<int> &state, Node &p) : state(state), parent(&p){ }
};
int main() {
//Initial Node
vector<int> initialState = { 1,2,3 };
Node initialNode(initialState);
vector<Node> listNodes;
listNodes.push_back(initialNode);
while (!listNodes.empty()) { //lisNodes[i].parent->state = {}; 2nd iteration
Node node = listNodes.back(); //node.parent appears to point to node; 2nd iteration
listNodes.erase(listNodes.begin());
for (int i = 0; i < 2; i++) {
vector<int> childState = { i+4,i+5,i+6 };
Node childNode(childState, node);
listNodes.push_back(childNode);
} //Inside for loop lisNodes[i].parent->state = {i+4,i+5,i+6}
}
return 0;
}
在while循环的第二次迭代中,listNodes
内的父项状态为空
//lisNodes[i].parent->state = {}
此外,parent
中的node
似乎在第二次运行期间指向自身,而不是实际的父节点
我不确定为什么会发生这种情况或者可能解决这个问题。
答案 0 :(得分:3)
一个主要问题是
Node node = listNodes.back();
这里node
是while循环的本地,但你存储指向它的指针。当该节点在循环结束时被销毁时,所有指针现在都悬空了。
一般来说,解决方法是使用
Node& node = listNodes.back();
所以现在你有一个可以引用的持久对象。但问题是您正在使用
修改向量listNodes.erase(listNodes.begin());
在该行之后,迭代器之后所有指针和向量中元素的引用都将失效,back()
会为您提供一个无效的元素。
您将切换到未使引用无效的容器,或者找到填充树结构的不同方法。