2010-05-23 25 views
6

esta es mi primera publicación aquí. Como soy novato, el problema puede ser estúpido. Estaba escribiendo una pieza de código, mientras que el siguiente mensaje de error se muestra,finalizar llamado después de lanzar una instancia de 'std :: length_error'

por terminado llama después de lanzar una instancia de 'std :: length_error'

lo que(): basic_string :: _ S_create

/home/gcj/final/home/gcj/quals donde Abortado

el siguiente es el código ofensivo, especialmente la Línea 39 a la Línea 52. Se me ha encargado ya que este bloque de código es casi el mismo que el 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(); }

mejores deseos, Marcos

+5

Por favor, marque la línea 39 a 52. No hay números de línea en SO. – kennytm

+0

Parece que está haciendo un montón de trabajo para hacer cumplir que 'dirs' y' need' son únicos. Tal vez cambie de 'vector' a' conjunto', y lo hará automáticamente. – Stephen

+3

Las personas no te ayudarán a menos que lo hagas fácil. 1) El código no está completo y no se compila. 2) ¿Cómo podemos probarlo de la misma manera que sin el mismo archivo de entrada? 3) Es poco probable que los números de línea coincidan con los números de línea para cualquier otra persona (marque el código incorrecto con un comentario). –

Respuesta

4

Va a añadir elementos a los dirs y vectores need al iterar sobre ellos. Esto no está permitido: si agregar un elemento requiere una reasignación, invalidará todos los iteradores existentes y puede causar varios errores la próxima vez que acceda a ellos.

0

No sé cuál es la manera correcta de hacerlo, pero como fue difícil encontrar esta respuesta, lo pondré aquí. "terminate called after throwing 'foo'" solo significa que la excepción no fue atrapada por ninguna cláusula try ... catch.

Cuestiones relacionadas