2010-05-23 3 views
6

이것은 내 첫 번째 게시물입니다. 내가 초보자 인 것처럼 문제는 어리 석을 수 있습니다. 다음과 같은 오류 메시지가 표시 동안 내가terminate 'std :: length_error'의 인스턴스를 던진 후에 호출됩니다.

은 '표준 : length_error'

의 인스턴스를 던지는 후 호출 종료 코드의 조각을 쓰고 있었는지() : : : _ basic_string S_create

/홈/gcj/finals/home/gcj/quals Aborted

다음은 잘못된 코드입니다. 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(); }

안부

, 마크

+5

39-52 행에 표시하십시오. SO에 줄 번호가 없습니다. – kennytm

+0

"dirs"와 "need"가 고유하다는 것을 강요하기 위해 많은 일을하고있는 것처럼 보입니다. 아마'vector'에서'set'으로 바뀔 수도 있고, 자동으로 할 것입니다. – Stephen

+3

사람들은 쉽게하지 않으면 도움을주지 않을 것입니다. 1) 코드가 완전하지 않아 컴파일되지 않습니다. 2) 동일한 입력 파일이 없으면 어떻게 테스트 할 수 있습니까? 3) 줄 번호는 다른 사람의 줄 번호와 일치하지 않을 수 있습니다 (잘못된 코드를 주석으로 표시하십시오). –

답변

4

당신은 dirsneed 벡터에 항목을 추가합니다. 이것은 허용되지 않습니다. 항목을 추가하려면 재 할당이 필요하면 기존의 모든 반복자가 무효화되고 다음에 액세스 할 때 다양한 오류가 발생할 수 있습니다.

0

올바른 방법은 무엇인지 모르겠지만이 답변을 찾기가 어려웠으므로 여기서 설명하겠습니다. "terminate called after throwing 'foo'"은 예외가 어떤 try ... catch 절에 의해 catch되지 않았 음을 나타냅니다.

관련 문제