2015-01-24 3 views
1

Вот мой код:итерация через вектор STRUCT элементов

#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; 
} 

Каким-то образом итерации через все векторные элементы не работают. Моя структура: node. open является вектор node элементов. Я пытаюсь выполнить итерацию через все элементы node в функции findmin. Возможна ли коррекция и причина?

EDIT:

Теперь предположим, что я хочу, чтобы использовать эту функцию, как это, поместив следующие строки соответственно в основной() в коде выше:

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); 
     } 

    } 

Почему это не работает?

+1

Помните, что итераторы имеют аналогичные указатели, поэтому вы должны их разыменовать правильно, например, 'It-> f'. Или, возможно, используйте [диапазон для цикла] (http://en.cppreference.com/w/cpp/language/range-for). –

+0

Какой полуналоженный компилятор, который вы используете, компилирует это? – dmg

+0

'it-> f' работает, но у меня есть еще одна проблема. см. EDIT выше. –

ответ

1
  1. В следующий раз предоставьте дополнительную информацию по вашему вопросу. Вы должны быть более конкретными, скажите, компиляция ошибок или время выполнения и какие ошибки произошли.
  2. Fix ваш 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. Не передавайте vector<node>. Передайте его ссылку (или лучшую постоянную ссылку). Потому что в вашем примере вектор будет скопирован. И используйте const_iterator.

    node findmin(const vector<node>& open) { /**/ } 
    
  4. ли erase в петле, как этот

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

    Но вам нужно будет перегрузить operator== или написать некоторые другие условия в if заявлении.

+0

Так что это была ошибка компиляции. Также PLS решить мой другой вопрос в разделе EDIT выше. –

+0

должен работать, но не знаю, почему он дает следующую ошибку: 'no match for 'operator ==' (типы операндов - это« узел »и« узел »)' –

+0

, которые сработали. спасибо. –

1

Я не вижу причин, почему !open.empty() должен оцениваться до false, так как «открытый» вектор не подвергается воздействию в теле цикла. Таким образом, у вас есть бесконечный цикл в вашем главном. Я думаю, что это ошибка.

+0

исправил это, еще раз обратитесь к моему вопросу. –

Смежные вопросы