Sugerencias!

Iniciado por MellaSystems, 13 Marzo 2015, 03:56 AM

0 Miembros y 1 Visitante están viendo este tema.

MellaSystems

Tengo esta funcion para agregar un string a un vector, pero con la condicion de no  tener nombres repetidos pero me explota el programa.

Código (cpp) [Seleccionar]
void addNomEst(){
                  system("cls");
                  cout<<"\n\n\t   <<<<<<<<<<<<<<<<<<<<MENU INSERTAR>>>>>>>>>>>>>>>>>>>>>>>\n\n\n";
                  string nombre;
                  int PosNom= 0, j=0;
                  cout<<"Digite el nombre que desea agregar: ";
                  cin.ignore(256,'\n');
                  cin >> nombre;
                  for(it = NomEst.begin(); it != NomEst.end(); ++it){
                     if((*it) == nombre){     
                        PosNom++;     
                           }
                          } if (PosNom > 0){
                        j++;
                        system ("cls");
                        cout << "\n\nESTE NOMBRE YA EXISTE!!!" << endl;
                        cout << "\n\nFAVOR DIGITAR OTRO NOMBRE DE ESTUDIANTE DIFERENTE\n" << endl;                                          
                        system("pause");
                       }PosNom = 0;
                         NomEst.push_back(nombre);
                        if(j==1){
                           NomEst.erase(it);
                           vector<string>::iterator itTemp = --it;
                           PosNom++;
                        }
                        j=0;
                  system("pause");
                  }



miren la imagen.


Orubatosu

Hombre... no soy un experto, pero veo algunas cosas que no me cuadran, a ver si me las puedes explicar.

Asumo que es una función, a la que además no le pasas parámetros ¿?¿? Debo de suponer que NoEst la has definido como global. ¿Es así?...

Luego veo que usas iteradores, lo cual me parece estupendo... solo que no has definido el iterador dentro de la función.

Este tipo de error suele darse cuando el bucle se "sale" de los límites del objeto.

¿Debo de entender que todo lo has hecho global?... los iteradores son muy puñeteros en estas cosas, y yo al menos suelo declararlos siempre dentro de su ámbito de trabajo, ya que desaparecen fuera del mismo.

Al margen de eso, si efectivamente estás trabajando con "todo global", comentarte que es una costumbre cuestionable, ya que es una fuente de errores muy grande
"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998

ivancea96

Pese a que sea correcto poner ++j y luego compararlo con 1 es poco entendible. Usa en su lugar una variable bool (o haz "j = 1;")

Luego:
Código (cpp) [Seleccionar]
if(j==1){
    NomEst.erase(it);
    vector<string>::iterator itTemp = --it;
    PosNom++;
}


Desde el momento en que haces push_back, el iterador 'it' puede quedar inservible. Haz en su lugar NomEst.erase(NomEst.end()-1).

El problema está mal planteado:
"Añadir al vector el valor. Si ya existía, lo elimino."

Lo lógico es:
"Si no existe el valor, añadirlo."

MellaSystems

Gracias a ambos sus respuestas me sirvieron. Otacu me ayudaste ya que mi Iteradores de salía de rango e Iván me aclaró la lógica de mi algoritmo