我有一个问题要问。
所以,我有一个结构调用 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的新手。我该如何解决这个问题?
我最诚挚的问候......
答案 0 :(得分: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);
答案 1 :(得分:2)
使用std::min_element
algirithm并重载比较函数
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
功能
答案 2 :(得分: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;
}