-1

我有一个程序从 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;
}
4

2 回答 2

2
unsigned n,x1,x2;
vector< list<unsigned> > successor(n);

这是一个明显的错误——您n用于指定 的大小successor,但n尚未初始化,因此它包含垃圾(同样如此,count因为marks您也指定了它们的大小n)。换句话说,在这一点上,我们对 的大小一无所知successor

你有几个选择。你可以移动你的idata >> n; 定义successorcount和之前marks,或者您可以在没有大小的情况下定义它们,然后resizenidata.

std::list除了指出我很少发现它是最佳选择之外,我将停止我通常的咆哮。

于 2012-04-16T04:02:58.277 回答
0

读入x1和的值是什么x2?如果值大于n,则对向量元素的访问无效:count[x2]marks[x1]successor[x1]引用无效元素。

使用函数代替下标符号 ( []),该at()函数执行边界检查以捕获第一个无效访问。

于 2012-04-16T03:50:02.793 回答