2010-05-23 15 views
6

questo è il mio primo post qui. Essendo un principiante, il problema potrebbe essere stupido. Stavo scrivendo un pezzo di codice, mentre il seguente messaggio di errore visualizzato,terminare chiamato dopo aver lanciato un'istanza di "std :: length_error"

Termina chiamata dopo aver lanciato un caso di 'std :: length_error'

cosa(): basic_string :: _ S_create

/home/gcj/finals/home/gcj/quals dove Aborted

il seguente è il codice offensivo in particolare dalla riga 39 alla linea 52. Per me è un problema perché questo blocco di codice è quasi uguale a quello da Line64 a 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(); }

migliori saluti, Mark

+5

Si prega di contrassegnare le righe da 39 a 52. Non ci sono numeri di riga in SO. – kennytm

+0

Sembra che tu stia facendo un sacco di lavoro per far rispettare che 'dirs' e' need' sono unici. Magari passa da 'vector' a' set', e lo farà automaticamente. – Stephen

+3

Le persone non saranno d'aiuto se non lo renderai facile. 1) Il codice non è completo e non viene compilato. 2) Come possiamo testarlo allo stesso modo di te senza lo stesso file di input? 3) È improbabile che i numeri di riga corrispondano ai numeri di riga di altri (contrassegnare il codice errato con un commento). –

risposta

4

Stai delle voci al dirs e need vettori, mentre l'iterazione su di loro. Ciò non è consentito: se l'aggiunta di un elemento richiede una riallocazione, invaliderà tutti gli iteratori esistenti e può causare vari errori al successivo accesso.

0

Non so quale sia il modo corretto per farlo, ma dal momento che è stato difficile trovare questa risposta, lo metto qui. "terminate called after throwing 'foo'" significa semplicemente che l'eccezione non è stata rilevata da alcuna clausola try ... catch.

Problemi correlati