我有一个程序从c ++中的2个文件中获取输入。然后识别第二个输入文件是拓扑排序吗?但不知何故,如果我在while循环语句中使用list.empty(),它会给我一个分段错误,但for循环不会给我任何错误;但是,for循环只循环一次,因为我可能需要经历两次。
#include <list>
#include <iostream>
#include <vector>
using namespace std ;
list<unsigned> output;
list<unsigned> &
testSort ( istream & idata , istream & sdata )
{
unsigned n,x1,x2;
vector< list<unsigned> > successor(n);
vector<unsigned> count(n,0);
vector<bool> marks(n,false);
idata >>n;
for(int i=0;i<n;i++) {
idata>>x1>>x2;
count[x2]++;
successor[x1].push_back(x2);
if(idata.eof()) break;
}
for(int i=0;i<n;i++) {
sdata>>x1;
if(count[x1]==0) {
marks[x1]=true;
//for(int j=0;j<successor[x1].size();++j) {
while(!successor[x1].empty()) {
count[successor[x1].front()]--;
successor[x1].pop_front();
}
}
else {
for(int i=0;i<n;i++)
{
if(marks[i]==false)
output.push_back(i);
}
break;
}
}
return output;
}
答案 0 :(得分:2)
unsigned n,x1,x2;
vector< list<unsigned> > successor(n);
这是一个明显的错误 - 您使用n
来指定successor
的大小,但n
尚未初始化,因此它包含垃圾(以及count
和marks
也是如此,因为您已将其大小指定为n
。换句话说,在这一点上,我们对successor
的大小没有任何线索。
你有几个选择。你可以移动idata >> n
; 之前定义successor
,count
和marks
,或者您可以在没有大小的情况下定义它们,然后使用resize
指定它们的大小在您从n
阅读idata
之后。
我会忽略我常见的关于std::list
的咆哮,指出我很少发现它是最佳选择。
答案 1 :(得分:0)
在x1
和x2
中读取的值是什么?如果值大于n
,则对向量元素的访问无效:count[x2]
,marks[x1]
和successor[x1]
引用无效元素。
使用[]
函数代替下标符号(at()
),该函数执行边界检查以捕获第一个无效访问。