这是我在这里的第一篇文章。由于我是新手,所以这个问题可能很愚蠢。显示以下错误消息时,我正在编写一段代码:

抛出'std::length_error'实例后调用终止

what():基本字串:: _ S_create

/home/gcj/finals/home/gcj/quals中止的地方

以下是有问题的代码,尤其是第39行到第52行。对我来说,这很奇怪,因为此代码块与Line64到Line79几乎相同。



int main(){


std::vector<std::string> dirs, need;
std::string tmp_str;
std::ifstream fp_in("small.in");
std::ofstream fp_out("output");
std::string::iterator iter_substr_begin, iter_substr_end;
std::string slash("/");

int T, N, M;

fp_in>>T;
for (int t = 0; t < T; t++){
  std::cout<<" time "<< t << std::endl;

  fp_in >> N >> M;
  for (int n =0; n<N; n++){
    fp_in>>tmp_str;
    dirs.push_back(tmp_str);
    tmp_str.clear();
  }
  for (int m=0; m<M; m++){
    fp_in>>tmp_str;
    need.push_back(tmp_str);
    tmp_str.clear();
  }


  for (std::vector<std::string>::iterator iter = dirs.begin(); iter!=dirs.end(); iter++){
    for (std::string::iterator iter_str = (*iter).begin()+1; iter_str<(*iter).end(); ++iter_str){
  if ((*iter_str)=='/') {
    std::string tmp_str2((*iter).begin(), iter_str);
    if (find(dirs.begin(), dirs.end(), tmp_str2)==dirs.end()) {
      dirs.push_back(tmp_str2);
    }

  }

    }

  }

  for (std::vector<std::string>::iterator iter_tmp = dirs.begin(); iter_tmp!= dirs.end(); ++iter_tmp)
    std::cout<<*iter_tmp<<" ";


  dirs.clear();
  std::cout<<std::endl;
  std::cout<<" need "<<std::endl;

  //processing the next


  for (std::vector<std::string>::iterator iter_tmp = need.begin(); iter_tmp!=need.end(); ++iter_tmp)
    std::cout<<*iter_tmp<<" ";

  std::cout<<"  where ";

  for (std::vector<std::string>::iterator iter = need.begin(); iter!=need.end(); iter++){
    for (std::string::iterator iter_str = (*iter).begin()+1; iter_str<(*iter).end(); ++iter_str){
  if ((*iter_str)=='/') {
    std::string tmp_str2((*iter).begin(), iter_str);
    if (find(need.begin(), need.end(), tmp_str2)==need.end()) {
      need.push_back(tmp_str2);
    }


  }

    }

  }

  for (std::vector<std::string>::iterator iter_tmp = need.begin(); iter_tmp!= need.end(); ++iter_tmp)
    std::cout<<*iter_tmp<<" ";


  need.clear();
  std::cout<<std::endl;


  //finish processing the next
 }


for (std::vector<std::string>::iterator iter= dirs.begin(); iter!=dirs.end(); iter++)
  std::cout<<*iter<<" ";
std::cout<<std::endl;



for (std::vector<std::string>::iterator iter= need.begin(); iter!=need.end(); iter++)
  std::cout<<*iter<<" ";
std::cout<<std::endl;


fp_out.close();


}

最好的祝福,
标记

最佳答案

您要在dirsneed vector 上添加项目,同时对其进行迭代。这是不允许的:如果添加项目需要重新分配,它将使所有现有的迭代器无效,并在您下次访问它们时引起各种错误。

关于c++ - 抛出 'std::length_error'实例后终止调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2892649/

10-15 14:28