遍历结构元素向量

iterating through a vector of struct elements

本文关键字:向量 元素 结构 遍历      更新时间:2023-10-16

这是我的代码:

#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. opennode元素的向量。我正在尝试迭代findmin函数中的所有node元素。可以建议更正和原因吗?

编辑:

现在假设我想通过在上面的代码中适当地将以下行放在main()中来像这样使用这个函数:

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. 下次为您的问题提供更多信息。你需要更具体,告诉是编译错误,还是运行时以及发生了什么错误。
  2. 修复您的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写一些其他条件。

我看不出!open.empty()有任何理由应该计算false,因为"开放"向量在循环体中没有受到影响。所以你的主循环中有一个无限循环。我认为这是错误。