В настоящее время я пытаюсь реализовать алгоритм поиска пути A * с использованием C ++.
У меня есть некоторые проблемы с указателями ... Обычно я нахожу способ избежать их использования, но теперь я предполагаю, что должен их использовать.
Допустим, у меня есть класс "узла" (не связанный с A *), реализованный так:
class Node
{
public:
int x;
Node *parent;
Node(int _x, Node *_parent)
: x(_x), parent(_parent)
{ }
bool operator==(const Node &rhs)
{
return x == rhs.x && parent == rhs.parent;
}
};
У него есть значение (в данном случае int x) и родительский элемент (указатель на другой узел), используемый для навигации по узлам с указателями родителя.
Теперь я хочу иметь список узлов, который содержит все узлы, которые были или рассматриваются. Это будет выглядеть так:
std::vector<Node> nodes;
Мне нужен список, который содержит указатели, указывающие на узлы в списке узлов .
Объявлено так:
std::vector<Node*> list;
Однако я определенно не правильно понимаю указатели, потому что мой код не будет работать.
Вот код, о котором я говорю:
std::vector<Node> nodes;//nodes that have been considered
std::vector<Node*> list;//pointers to nodes insided the nodes list.
Node node1(1, NULL);//create a node with a x value of 1 and no parent
Node node2(2, &node1);//create a node with a x value of 2 and node1 being its parent
nodes.push_back(node1);
list.push_back(&nodes[0]);
//so far it works
//as soon as I add node2 to nodes, the pointer in "list" points to an object with
//strange data, with a x value of -17891602 and a parent 0xfeeefeee
nodes.push_back(node2);
list.push_back(&nodes[1]);
Происходит явно неопределенное поведение, но я не могу понять, где.
Может кто-нибудь показать мне, где мое непонимание указателей нарушает этот код и почему?