2010-05-23 6 views
6

das ist mein erster Beitrag hier. Da ich ein Neuling bin, könnte das Problem dumm sein. Ich war ein Stück Code zu schreiben, während die folgende Fehlermeldung angezeigt,beenden aufgerufen nach dem Werfen einer Instanz von 'std :: length_error'

nach dem Werfen einer Instanz von 'std :: length_error'

was() aufgerufen terminate: basic_string :: _ S_create

/home/gcj/ends/home/gcj/quals wo Aborted

ist der folgende Code besonders Linie 39 zu Linie 52. Es ist für mich wie dieses Line-of-Code fast identisch wie die Line64 zu 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(); }

freundlichen Grüßen Mark

+5

Bitte markieren Sie die Zeile 39 bis 52. In SO gibt es keine Zeilennummern. – kennytm

+0

Es sieht so aus, als ob Sie viel Arbeit machen, um zu erzwingen, dass "dirs" und "need" einzigartig sind. Vielleicht wechsele ich von 'vector' zu' set' und es wird automatisch gemacht. – Stephen

+3

Die Leute werden nicht helfen, wenn Sie es nicht einfach machen. 1) Der Code ist nicht vollständig und kompiliert nicht. 2) Wie können wir es genauso testen wie Sie ohne die gleiche Eingabedatei? 3) Zeilennummern für Sie sind unwahrscheinlich, Liniennummern für irgendjemand anderen zu entsprechen (markieren Sie den schlechten Code mit einem Kommentar). –

Antwort

4

Sie sind das Hinzufügen von Elementen zu den dirs und need Vektoren, während über sie iterieren. Dies ist nicht zulässig: Wenn das Hinzufügen eines Elements eine Neuzuweisung erfordert, werden alle vorhandenen Iteratoren ungültig und können beim nächsten Zugriff verschiedene Fehler verursachen.

0

Ich weiß nicht, was ist der richtige Weg, um es zu tun, aber da es schwer war, diese Antwort zu finden, werde ich es hier setzen. "terminate called after throwing 'foo'" bedeutet nur, dass die Ausnahme von keiner try ... catch Klausel abgefangen wurde.

Verwandte Themen