如何获取列表中对象的最小值(C ++)

时间:2012-11-12 09:23:21

标签: c++ search stl

我有一个问题要问。

所以,我有一个结构调用 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的新手。我该如何解决这个问题?

我最诚挚的问候......

3 个答案:

答案 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;
}