建模最短路径算法时出现队列问题

问题描述

| 我有一个队列问题。为图形建模,我正在用C ++做最短路径算法。 当我回到这句话时,在我的
while (!q.empty())
中,前面的
vertex*
被改变了。 你能弄清楚为什么吗?
int MyMatrix::searchBreadth(MyVertex* from,MyVertex* to)
{
queue<MyVertex*> q;  
path=INFINITY;

from->visit();  
from->setdistance(0);  
q.push(from);  

//here q.front()\'s attributes get changed when returning from the for-loop  
while(!q.empty())
{  
    MyVertex* v=q.front();  
    q.pop();  
    int k=v->getdistance();  
    vector<MyVertex> nb=getNeighbours(*v);  
    for(int i=0;i<nb.size();i++)  
    {  
        if(nb[i].getdistance()==INFINITY)
        {  
            nb[i].setdistance(k+1);  
            q.push(&nb[i]);  
        }

        if((nb[i].getName().compare(to->getName())==0)
           && !nb[i].isVisited())
        {
            //path found  
            int j=nb[i].getdistance();  
            if(j<path) path=j;  
        }  

        nb[i].visit();  
     }  
}  
return path;  

}   
这是getNeighbours()
vector<MyVertex> MyMatrix::getNeighbours(MyVertex &v)
{  
    int index=0;  
    for(int l=0; l<stations.size(); L++ )
    {  
        if(stations[l].getName().compare(v.getName())==0)index=l;  
    }

    vector<MyVertex> out;  
    for(int k=0;k<matrixSize;k++)
    {  
        if(matrix[index][k].getName().compare(\"null\")!=0)
        {  
            out.push_back(matrix[index][k].getTo());  
        }  
    }  

    return out;
}
    

解决方法

        您的问题很细微,但与
q.push(&nb[i])
有关。您正在做的是在向量中添加一个指向位置的指针,这在概念上与向“ 5”对象添加指针不同。邻居向量包含“按值”的“ 5”个对象(如果这有助于您理解问题)。 看一下内存中的“ 7”可能会有所帮助:
        0         1                   I
nb [MyVertex0|MyVertex1|   ...   |MyVertexI]
             +---------+
                  | (Notice it is NOT pointing to MyVertex1!)
&nb[1]------------+
&nb[1]
时,即按地址pushing10ѭ。在堆栈上声明了“ 7”,因此该地址将位于堆栈上的某个位置。 因此,当您的
for
循环回来时,
nb
会被刷新(可以这么说)并添加新数据。但是,您的队列“ 14”中包含进入“ 7”的地址,这些地址不再有效! 简而言之:您的队列引用的是向量中的LOCATION,而不是向量中的DATA。 如果您想保持方法不变,则意味着
getNeighbors
需要更改以返回a17ѭ的向量。 您应该简单地编辑
BreadthFirstSearch
以获取两个
MyVertex&
,而不是指针。然后将would14ѭ更改为
queue<MyVertex>
,将
v
更改为
MyVertex
,最后您应将
q.push(&nb[i])
更改为just25ѭ。