0

我有个问题要问。

因此,我有一个名为Node的结构,如下所示:

struct Node
{
    int xKoor, yKoor;

    Node *parent;                                                                   
    char nodeId;                                                                    

    float G;
    float H;
    float F;

    Node(int x, int y, int id, Node * par)
    {
        xKoor = x;
        yKoor = y;
        nodeId = id;
        parent = 0;
    }

    Node(int x, int y, char id)                                                     
    {
        xKoor = x;
        yKoor = y;
        nodeId = id;
    }
};

我有包含此结构元素的列表:

list<Node*> OPEN;

该列表的大小随时间而变化。

我需要做的是找到具有最小 F 值的 Node 对象,然后从列表中弹出该对象。

因此,我尝试编写如下所示的函数:

void enKucukFliNodeBul(list<Node*> OPEN)
{

    list<Node*>::iterator it = OPEN.begin();

    for(it = OPEN.begin(); it != OPEN.end(); it++)
    {
        if(it._Ptr->_Myval->F < it._Ptr->_Next->_Myval->F)
        {

        }
    }
}

但我被困住了。我是 STL 的新手。我该如何解决这个问题?

我最诚挚的问候...

4

3 回答 3

6

您可以为此使用带有合适比较函数的std::min_element 。

bool nodeComp(const Node* lhs, const Node* rhs) {
  return lhs->F < rhs->F;
}


#include <algorithm> // for std::min_element

list<Node*>::iterator it = std::min_element(OPEN.begin(), OPEN.end(), nodeComp);

这假设list<Node*>std::list<Node*>,在这种情况下,您应该知道它std::list本身是一个链表。

其他有用的操作,根据您的意见:

从列表中删除一个最小值节点并将其删除:

OPEN.erase(it);
delete *it; //

如果您的节点相互依赖,您可能需要执行其他操作。

对列表进行排序:

OPEN.sort(nodeComp);
于 2012-11-12T09:26:25.683 回答
2

使用std::min_element算法和重载比较函数

bool compareF(Node *lhs, Node *rhs) 
{
 return lhs->F < rhs->F; 
}

如果您使用的是 C++03:

std::<Node*>::itertor ter = std::min_element(OPEN.begin(),OPEN.end(), compareF);

如果您使用的是 C++11:

auto iter = std::min_element(OPEN.begin(),OPEN.end(), compareF);

要对列表进行排序,您可以调用OPEN.sort(compareF);使用compareF函数对列表进行排序

于 2012-11-12T09:28:12.557 回答
1

尝试添加这个:

bool compare_node_F(Node* n1, Node* n2)
{
  return n1-> F< n2-> F;
}

#include <list>
#include <algorithm>
#include <cstdlib>
#include <iostream>

int main()
{
  std::list<Node*> nodes;
  for(int i= 100; i--;)
  {
    Node* n= new Node(42, 42, 42);
    n-> F= i;
    nodes.push_back(n);
  }
  std::list<Node*>::iterator min_element_iter= std::min_element(nodes.begin(), nodes.end(), compare_node_F);
  std::cout<< "Min F: "<< (*min_element_iter)-> F<< '\n';
  for(std::list<Node*>::iterator d= nodes.begin(); d!= nodes.end(); ++ d)
    delete *d;
}
于 2012-11-12T09:35:28.843 回答