Aquí está mi código:

#include<iostream>
#include <vector>
#include <stack>

using namespace std;

struct node {
    node *parent;
    int x, y;
    float f, g, h;
    };
node findmin(vector<node> open)
{
    int mini=2000000;
    node iter,mininode;

    std::vector<node>::iterator it;
    for(it = open.begin(); it != open.end(); ++it) {
        if(it.f<mini)
            {
                mini=it.f;
                mininode=it;
            }
    }
    return mininode;
}
int main() {

    vector<node> open;
    vector<node> closed;

    node start;
    start.x=50;
    start.y=50;
    start.f=0;
    start.g=0;
    start.h=0;// you can take it as zero. works instead of the actual distnace between goal and start.

    node goal;
    goal.x=53;
    goal.y=50;
    goal.f=-1;
    goal.g=-1;
    goal.h=0;

    // put the starting node on the open list
    open.push_back(start);


    node current,temp;
    current=findmin(open);
   // THE EDIT CODE GOES HERE.

    return 0;
}

De alguna manera, la iteración a través de todos los elementos vectoriales no funciona. Mi estructura es node. open es un vector de node elementos. Estoy tratando de iterar a través de todos los elementos node en la función findmin. ¿Se puede sugerir la corrección junto con la razón?

EDITAR:

Ahora suponga que quiero usar esta función de esta manera colocando las siguientes líneas apropiadamente en main () en el código anterior:

node current,temp;
current=findmin(open);
cout<<current.f;

for(vector<node>::iterator it = open.begin(); it != open.end(); ++it) {
    if(*it==current)
        {
            open.erase(*it);
        }

    }

¿Por qué no funciona?

1
user_1_1_1 24 ene. 2015 a las 12:25

2 respuestas

La mejor respuesta
  1. La próxima vez proporcione más información para su pregunta. Debe ser más específico, decir si compila errores o tiempo de ejecución y qué errores ocurrieron.
  2. Corrija su función findmin

    node findmin( vector<node> open ) {
        int mini = 2000000;
        node iter, mininode;
    
        std::vector<node>::iterator it;
        for( it = open.begin( ); it != open.end( ); ++it ) {
            if( it->f<mini ) {
                mini = it->f;
                mininode = *it;
            }
        }
        return mininode;
    }
    
  3. No pase vector<node>. Pase su referencia (o mejor referencia constante). Porque en tu ejemplo se copiará el vector. Y usa const_iterator.

    node findmin( const vector<node>& open ) { /**/ }
    
  4. Haz erase en el bucle como este

    for (vector<node>::iterator it = open.begin(); it != open.end(); /* ++it*/) {
      if(*it == current) 
         it = open.erase(it);
      else 
         ++it;
    }
    

    Pero necesitará sobrecargar operator== o escribir alguna otra condición en la declaración if.

1
NikolayK 24 ene. 2015 a las 09:53

No veo ninguna razón por la que !open.empty() deba evaluarse a false, porque el vector "abierto" no se ve afectado en el cuerpo del bucle. Entonces tienes un bucle infinito en tu archivo main. Creo que este es el error.

1
Oleg Andriyanov 24 ene. 2015 a las 09:43