0

誰かがこれで私を助けてくれることを願っています。

このプログラムを修正しようとしましたが、他に何をすればよいかわかりません。ベクトルの添え字が範囲外であるというこのエラーが発生し続けます。ただ、「main」で作成した各変数にpush_backでオブジェクトを追加しているので何が問題なのかわかりません。

問題は、9 つ​​の都市からなる一種のグラフです。各都市は、1 つの都市に直接接続されています。関数「ショートパス」を使用して、各都市の親をメンバー previous1 に追加します。

しかし、プログラムを実行すると、メインで push_backed したにもかかわらず、都市の変数 "neighbor1" のサイズが 0 であると表示され続けます。

#include<iostream>
#include<vector>
#include<queue>
#include<string>


using namespace std;

class City
{
public:

City();
City( string city );
string cityName;
int cityDistance;
vector<City> neighbor1;
bool visited1;
vector<City> previous1;
void addNeighbor( City c );
void shortPath( vector<City> cities );
void printPath( City final );

};

これは、ヘッダー ファイルの実装です。

#include<iostream>
#include<vector>
#include<queue>
#include<string>


using namespace std;
#include"City.h"



City::City()
{
cityDistance = -1;
cityName = " ";
visited1 = false;

}
City::City( string city )
{
cityDistance = -1;
cityName = city;
visited1 = false;


}

void City::addNeighbor( City c )
{
neighbor1.push_back( c );
}

void City::shortPath( vector<City> cities )
{
queue<City*> q;
q.push(this);

for( unsigned int i = 0; i < cities.size(); i++ )
{
    cities[i].cityDistance = -1;
    cities[i].visited1 = false;

}

q.front()->visited1 = true;

q.front()->cityDistance = 0;

while( !q.empty() )
{
    City * v = q.front();

    if( v->neighbor1.size() != 0 )
    {

        for( unsigned int i = 0; i < v->neighbor1.size(); i++ )
        {
            City * z = &v->neighbor1[i];
            q.push( z );
            if( z->visited1 == false )
            {
                v->neighbor1[i].cityDistance = v->cityDistance + 1;
                v->neighbor1[i].previous1.push_back( *v );
                v->neighbor1[i].visited1 = true;
            }
        }


    }

    q.pop();

}




}





void City::printPath( City final )
{
if( final.previous1.size() != 0 )
{
    cout << final.previous1[0].cityName << endl;
}
else
{
    cout << "No previous for final" << endl;
}

}  

これがメインです:

#include<iostream>
#include<vector>
#include<queue>
#include<string>


using namespace std;
#include"City.h"

int main()
{


City NewDelhi = City( "New Delhi" );
City HongKong = City("Hong Kong");
City Washington = City("Washington");
City Dublin = City("Dublin");
City Lisbon = City("Lisbon");
City Vienna = City("Vienna");
City Santiago = City("Santiago");
City RioDeJaneiro = City("RioDeJaneiro");
City Berlin = City( "Berlin" );
City NewYork = City( "NewYork" );


vector<City> vector1;

vector1.push_back(HongKong);
vector1.push_back(NewDelhi);
vector1.push_back(Washington);
vector1.push_back(Dublin);
vector1.push_back(Lisbon);
vector1.push_back(Vienna);
vector1.push_back(Santiago);
vector1.push_back(RioDeJaneiro);
vector1.push_back(Berlin);
vector1.push_back(NewYork);



HongKong.neighbor1.push_back( NewDelhi);
NewDelhi.neighbor1.push_back( Washington);
Washington.neighbor1.push_back( Dublin );
Dublin.neighbor1.push_back( Lisbon );
Lisbon.neighbor1.push_back( Vienna );
Vienna.neighbor1.push_back( Santiago );
Santiago.neighbor1.push_back( RioDeJaneiro );
RioDeJaneiro.neighbor1.push_back( Berlin );
Berlin.neighbor1.push_back( NewYork );
NewYork.neighbor1.push_back( HongKong );




NewYork.shortPath( vector1 );

HongKong.printPath( NewYork );







system("PAUSE");
return 0;
 }
4

1 に答える 1

1

都市をコピーしています。

vector1vector1.push_back(HongKong);に元の City が追加されるのではなく、コピーが追加されます。

その後、HongKong.neighbor1.push_back( NewDelhi);のコピーではなく、オリジナルでのみ機能することを行いますvector

そのため、 vector1 を使用する場合NewYork.shortPath( vector1 );、近隣は含まれません。

于 2013-05-25T08:31:24.190 に答える