Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: MellaSystems en 13 Marzo 2015, 03:56



Título: Sugerencias!
Publicado por: MellaSystems en 13 Marzo 2015, 03:56
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
  1. void addNomEst(){
  2.                  system("cls");
  3.                  cout<<"\n\n\t   <<<<<<<<<<<<<<<<<<<<MENU INSERTAR>>>>>>>>>>>>>>>>>>>>>>>\n\n\n";
  4.                  string nombre;
  5.                  int PosNom= 0, j=0;
  6.                  cout<<"Digite el nombre que desea agregar: ";
  7.                  cin.ignore(256,'\n');
  8.                  cin >> nombre;
  9.                  for(it = NomEst.begin(); it != NomEst.end(); ++it){
  10.                     if((*it) == nombre){      
  11.                        PosNom++;      
  12.                           }
  13.                          } if (PosNom > 0){
  14.                        j++;
  15.                        system ("cls");
  16.                        cout << "\n\nESTE NOMBRE YA EXISTE!!!" << endl;
  17.                        cout << "\n\nFAVOR DIGITAR OTRO NOMBRE DE ESTUDIANTE DIFERENTE\n" << endl;                                          
  18.                        system("pause");
  19.                       }PosNom = 0;
  20.                         NomEst.push_back(nombre);
  21.                        if(j==1){
  22.                           NomEst.erase(it);
  23.                           vector<string>::iterator itTemp = --it;
  24.                           PosNom++;
  25.                        }
  26.                        j=0;
  27.                  system("pause");
  28.                  }


miren la imagen.

(http://i59.tinypic.com/2w7iyja.jpg)


Título: Re: Sugerencias!
Publicado por: Orubatosu en 13 Marzo 2015, 13:02
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


Título: Re: Sugerencias!
Publicado por: ivancea96 en 13 Marzo 2015, 13:47
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
  1. if(j==1){
  2.    NomEst.erase(it);
  3.    vector<string>::iterator itTemp = --it;
  4.    PosNom++;
  5. }

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."


Título: Re: Sugerencias!
Publicado por: MellaSystems en 14 Marzo 2015, 01:05
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