6

新規ユーザーはこちら。ノードでネットワークを作成し、乱数を使用してそれらの間にエッジを作成するこのコードを書いています。グラフ全体をベクトルとして追跡します。各エントリは、要素が隣接ノードであるノードを表すベクトルです。次に、深さ優先検索を使用して、グラフの分離された部分であるコンポーネントの数を見つけます (my count 変数)。次に、ノードと、ノードが接続されているネイバーの数を txt ファイルに出力します。コードはコンパイルされますが、コマンド プロンプトで次のエラーが表示されます。

'std::out_of_range' what(): vector::_M_range_check のインスタンスをスローした後に呼ばれる終了

このアプリケーションは、異常な方法で終了するようランタイムに要求しました。サポートに連絡してください...

それで...これはどういう意味ですか、どうすれば修正できますか?

また、各コンポーネントに含まれるノードの数を追跡する必要があります。アイデアはありますか?

前もって感謝します、ここに私のコードがあります:

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <vector>
using namespace std;

void gengraph(int v, float p, vector <vector <int> >& G);
void DFS(vector <vector <int> > G, int v, vector<int>& M);

int main()
{
    int a = 1000;
    float b = 0.004;
    vector <vector <int> > G;
    gengraph(a,b,G);
    vector <int> M (1000);
    int count = 0;
    int i;
    for (i = 0; i < a; i++)
    {
        if (M[i]==0)
        {
            DFS(G, i, M);
            count += 1;
        }
    }
    ofstream myfile;
    myfile.open ("data.txt");
    for (int l=0; l<1000; l++)
    {
        myfile << "v   len(G[v])\n";
    }
    myfile.close();
}
void gengraph(int v, float p, vector <vector <int> >& G)
{
    for (int i = 0; i<1000; i++)
    {  
        for (int j = 0; j<1000; j++)
        {
            int y = rand();
            bool Prob = (y <= p);
            if (i == j)
                continue;
            else
            {
                if(Prob == true)
                {
                    G.at(i).push_back (j);
                    G.at(j).push_back (i);
                }
            }
        }
    }
}
void DFS(vector <vector <int> >& G, int v, vector<int>& M)
{
    M[v]=1;
    for(unsigned int j = 0; j < G[v].size(); j++)
    {
        if (M[j]==0)
        {
            DFS(G, j, M);
        }
    }
}
4

4 に答える 4

2
vector <vector <int> > G;

これにより、int のベクトルのベクトルが作成されますが、最初は int のベクトルの要素はありません。それにもかかわらず、 which を呼び出すG.at(i)...と、 の任意の値に対してi、存在しない要素にすぐにアクセスできます。

これとは別に、rand()ランダムな 32 ビット整数を返すため、ほとんどの場合、 0.004 より大きくなりますfloat。のようなものを使用したい場合があります(rand() % 1000000 / 1000000.0)。乱数サブシステムは、呼び出し ala で初期化する必要がありますsrand(time(NULL));

より一般的には、std::cerr << "x is now " << x << '\n';出力変数、ベクトル サイズなど、コード全体に散らばったいくつかを使用して、コードが何をしていてどこが間違っているかを確認できるようにするのが最善です。または、インタラクティブなデバッガーを入手して、コードを 1 行ずつ実行できるかどうかを確認してください。

于 2013-02-26T01:24:24.580 に答える
2

ベクトルを作成しましたが、初期サイズは 0 です。

M.at() を使用してアクセスすると、このインデックスが範囲外かどうかがチェックされ、範囲外の場合は例外がスローされます。

ベクトルを次のように定義します。

vector<vector<int> > M(1000);

あなたの問題を解決するはずです。

gdb またはその他のデバッガーも使用する必要があります。それはあなたの人生をずっと楽にするでしょう

于 2013-02-26T01:11:23.400 に答える
0

これは、範囲外のベクトルにインデックスを付けたことを意味します。

vector::at()範囲チェックを実行します。に十分な要素を事前に割り当てていないことが原因である可能性がありますG

于 2013-02-26T01:01:40.803 に答える
0

最初のエラー: 関数 gengraph() で空のベクトルを使用します:

G.at(i) ...
G.at(j) ...

はい、push_back を呼び出しますが、at() が返したメソッドを呼び出します。ただし、ベクトルが空であるため、 at() は i と j の値が何であれ、何も返すことはできません。解決策の1つは、この行を gengraph() の先頭に置きます

G.resize( 1000 );

2 つ目のアドバイス: マジック ナンバーの使用はできるだけ避けてください。次のようなものを入れてください:

const int size = 1000; 

ファイルの先頭で、マジック ナンバー 1000 の代わりに size を使用します。特に次のようにします。

int a = 1000;
float b = 0.004;
vector <vector <int> > G;
gengraph(a,b,G);
vector <int> M (1000); // use a here and better call it something more meaningfulness than a
int count = 0;
int i;
for (i = 0; i < a; i++) { // or use M.size() here or both
}
于 2013-02-26T01:07:13.607 に答える