2010-05-23 41 views
6

'un bir örneğini attıktan sonra aranan sonlandır, bu benim ilk gönderiim. Ben acemi olarak, sorun aptal olabilir. Aşağıdaki hata iletisi gösterilir ederken'std :: length_error'

'std :: length_error'

bir örneğini atma sonra denilen sonlandırma, bir kod parçasını yazarken ne(): :: _ basic_string S_create

/home/Abone

Burada, özellikle satır 39, satır 52 için sorun kodudur. Bu kod bloğu, Line64 - Line79 ile hemen hemen aynı olduğundan, benim için kaplıdır. Üzerlerine yineleme sırasında

 

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

saygılarımla

, Mark

+5

Lütfen 39 ila 52 arasındaki çizgiyi işaretleyin. SO'da satır numarası yok. – kennytm

+0

Bu 'dirs' ve 'need' benzersiz olduğunu zorlamak için çok fazla iş yapıyoruz gibi görünüyor. Belki de 'vector'dan 'set''e geçersiniz, ve otomatik olarak yapar. – Stephen

+3

İnsanlar bunu kolaylaştırmazsanız yardımcı olmayacaktır. 1) Kod tamamlanmamış ve derlenmiyor. 2) Aynı giriş dosyası olmadan aynı şekilde nasıl test edebiliriz? 3) Sizin için satır numaraları, herhangi bir kimse için satır numaralarını eşleştirmesi olası değildir (kötü kodu bir yorum ile işaretleyin). –

cevap

4

Sen dirs ve need vektörlere öğeleri ekliyoruz. Buna izin verilmez: Bir öğenin eklenmesi bir yeniden ayırma gerektiriyorsa, varolan tüm yineleyicileri geçersiz kılar ve daha sonra eriştiğinizde çeşitli hatalara neden olabilir.

0

Bunu yapmanın doğru yolu nedir bilmiyorum, ama bu cevabı bulmak zor olduğu için buraya koyacağım. "terminate called after throwing 'foo'", yalnızca istisnanın herhangi bir try ... catch maddesi tarafından yakalanmadığı anlamına gelir.