Изменяется эталонное значение указателей структур c ++

Я реализую A * поиск пути в C ++. Проблема, с которой я сталкиваюсь, связана с указателями и ссылками, которые используются со структурами.

После выхода из цикла for он проходит через openList (вектор) и устанавливает currentNode для элемента с наименьшим значением F, F имеет тип int.

Когда currentNode изменяется, родитель который был ранее в цикле for, назначенном currentNode, изменяется

NavigationNode currentNode;

currentNode.x = 1;
currentNode.y = 2;

parent = &currentNode

если я обновлю currentNode к другому значению

currentNode.x =23;
currentNode.y = 1;

родитель также будет изменен. Я понимаю, что родитель держит адрес currentNode. поэтому любые изменения отражаются. Но я хочу знать, как сделать так, чтобы родительское значение не изменялось. если я позже обновлю currentNode

У меня есть структура, объявленная как

struct NavigationNode{
int x, y;
float f, g, h;
int value;
NavigationNode *parent;
};

Я создаю startNode из NavigationNode

NavigationNode startNode;
startNode.x = START_X;
startNode.y = START_Y;
startNode.g = 0;
startNode.f = 0;

Я вставил его в вектор с именем openList

vector<NavigationNode> openList;
openList.push_back(startNode);

NavigationNode currentNode;

Тогда я начинаю поиск пути

while (!openList.empty())
{
for (auto i = openList.begin(); i != openList.end(); ++i)
{
if (i == openList.begin() || (*i).f <= currentNode.f)
{
currentNode = (*i);
}
}

for (int i = 0; i < 8; i++)
{
NavigationNode nextNode;
nextNode.x = xChange;
nextNode.y = yChange;

// some logic operations
// assign the currentNode to the parentNode

nextNode.parent = &currentNode;
nextNode.value = map[xChange][yChange];

openList.push_back(nextNode);
}
}

-1

Решение

Причина, по которой изменения currentNode отражаются в parent, заключается в том, что я назначаю адрес parent. поэтому любые изменения отражаются. Тем не менее, теперь я создаю currentNode, как указатель, он будет иметь другой адрес. и объявил все остальное как указатели

   NavigationNode *startNode;
startNode->x = START_X;
startNode->y = START_Y;
startNode->g = 0;
startNode->f = 0;vector<NavigationNode*> openList;
openList.push_back(*startNode);

NavigationNode *currentNode = new NavigationNode;while (!openList.empty())
{

// sort the vector by increasing F values, so the lowest F values will be at the first location
//  sort(openList.begin(), openList.end(), compareByF);
for (auto i = openList.begin(); i != openList.end(); ++i){

if (i == openList.begin() || (*i)->f <= currentNode->f){
currentNode = (*i);
}
}

for (int i = 0; i < numberOfDirections; i++)
{
NavigationNode *nextNode = new NavigationNode;
nextNode->x = xChange;
nextNode->y = yChange;

// some logic operations
// assign the currentNode to the parentNode

nextNode->parent = currentNode;
nextNode->value = map[xChange][yChange];

openList.push_back(nextNode);

} // end for loop

}// end while loop
1

Другие решения

Других решений пока нет …