2010-05-23 131 views
6

這是我的第一篇文章。由於我是新手,這個問題可能很愚蠢。我寫一段代碼同時顯示以下錯誤消息,拋出'std :: length_error'實例後終止調用

終止叫做拋出 '的std :: length_error'

的實例以後有什麼():basic_string的:: _ S_create

/家/ 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(); }

最好的問候, 馬克

+5

請將第39行標記爲52. SO中沒有行號。 – kennytm 2010-05-23 17:20:25

+0

看起來你正在做很多工作來強制'dirs'和'need'是唯一的。也許從'vector'切換到'set',它會自動執行。 – Stephen 2010-05-23 17:23:16

+3

除非你讓事情變得簡單,否則人們不會去幫忙。 1)代碼不完整,不能編譯。 2)我們如何在沒有相同輸入文件的情況下以與您相同的方式測試它? 3)您的行號不可能與任何其他人的行號匹配(使用註釋標記錯誤代碼)。 – 2010-05-23 17:23:53

回答

4

您將項目添加到dirsneed載體在遍歷他們。這是不允許的:如果添加一個項目需要重新分配,它將使所有現有的迭代器失效,並且當您下次訪問它們時可能導致各種錯誤。

0

我不知道做什麼是正確的方法,但由於很難找到這個答案,我會把它放在這裏。 「terminate called after throwing 'foo'」僅僅意味着該例外沒有被任何try ... catch子句捕捉到。

相關問題