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し、Compare 関数をオーバーロードする

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 に答える