这里有新用户。 我一直在编写这个代码,它创建一个带有节点的网络,并使用随机数在它们之间创建边。我将整个图形跟踪为矢量,每个条目是一个向量,表示其元素是其邻居的节点。然后,它使用深度优先搜索来查找组件的数量,这些组件是图形的分离部分(我的计数变量)。然后我将节点及其连接的邻居数输出到txt文件中。代码编译,但命令提示符给我一个错误:
在抛出'std :: out_of_range'的实例后终止调用 what():vector :: _ M_range_check
此应用程序已请求Runtime以不寻常的方式终止它。 请联系支持人员......
那么......这意味着什么,我该如何解决?
另外,我需要跟踪每个组件中有多少节点,任何想法?
先谢谢,这是我的代码:
#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);
}
}
}
答案 0 :(得分:1)
您创建了矢量&gt;但它的初始大小为0.
现在当你使用M.at()访问它时,它会检查这个索引是否超出范围并在这种情况下抛出异常。
将向量定义为:
vector<vector<int> > M(1000);
应该解决你的问题。
您还应该使用gdb或其他调试器。它会让你的生活更轻松
答案 1 :(得分:1)
vector <vector <int> > G;
这会创建一个向量矢量的向量,但最初没有vector-of-int元素。尽管如此,你可以调用G.at(i)...
- 对于i
的任何值,立即访问不存在的元素。
另外,rand()
返回一个随机的32位整数,因此几乎总是超过0.004 float
。您可能希望使用(rand() % 1000000 / 1000000.0)
之类的内容。应使用调用ala srand(time(NULL));
更一般地说,你最好使用一些std::cerr << "x is now " << x << '\n';
- 打印变量,矢量大小等 - 分散在你的代码中,这样你就可以看到它在做什么以及它出错了。或者,看看您是否可以获得交互式调试器并逐行遍历代码。
答案 2 :(得分:0)
这意味着您将矢量索引到其范围之外。
vector::at()
执行范围检查。所以这可能是因为你没有为G
预先分配足够的元素。
答案 3 :(得分:0)
第一个错误:在函数gengraph()中使用空向量:
G.at(i) ...
G.at(j) ...
是的,你调用了push_back,但是你在()返回的是什么方法。但是at()不能返回任何值,因为你的向量是空的,我和j都有。其中一个解决方案是将这一行放在gengraph()
的开头G.resize( 1000 );
第二条建议:尽量避免使用魔法数字。举几句:
const int size = 1000;
在您的文件开头并使用大小而不是幻数1000。 尤其是:
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
}