Alguien que me ayude a hacer este codigo mas eficiente

Iniciado por MellaSystems, 9 Marzo 2015, 01:06 AM

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

MellaSystems

en un menu para listar, borrar, buscar un nombre en la clase vector:

Código (cpp) [Seleccionar]

//
#include <iostream>
#include <string>         
#include <vector>

using std::vector;
using std::cout;
using std::cin;
using std::string;
using std::endl;

class cEstudiante{
        public:
             string nomv;
             cEstudiante(string vnomv) : nomv(vnomv){}//constructor
      };

main(){
             int run, i, j=0, k=0, cont, con;
             string NomEst, BusNom, PosNom;
             vector<cEstudiante> vEstudiante;
             
             int OpcMen, sigue = 1; //Variables para controlar el menu
             do {
             system("cls");
     system (" color F0");
             cout << "\n\n\t\t<<<<<<<<<<<<<<<<<<<<<<<<MENU>>>>>>>>>>>>>>>>>>>>>>>>>>\n" << endl;
             cout << "\n\n 1 <**> INSERTAR DATOS" << endl;
             cout << " 2 <**> BORRAR DATOS" << endl;
             cout << " 3 <**> MOSTRAR DATOS" << endl;
             cout << " 4 <**> BUSCAR DATOS" << endl;
             cout << " 0 <**> SALIR" << endl << endl;
             cout<<"\n\t   Ingrese su opci\242n: ";
     while(!(std::cin>>OpcMen))
             {
      std::cin.clear();
      std::string error;
      std::cin>>error;
      system("cls");
              cout<<"\n\tLA OPCION INGRESADA NO EXISTE\n";
      cout<<"\n\tIngrese su opci\242n nuevamente: ";
              }
         switch(OpcMen) {
     case 1:
                  system("cls");
                  cout << "\n\nENTRE EL NOMBRE:\n " ;
                  fflush(stdin);
                  getline(cin, NomEst);
                  system("cls");
                 
                  do{
                    run = vEstudiante.size();
                    cont=0;                            
                     for (i=0;i<run;i++){     
                        cEstudiante runEstudiante = vEstudiante[i];
                         if(runEstudiante.nomv == NomEst){
                            cont++;
                            }      //I f
                        }      //for
                        if(cont>0){
                        j++; 
                        system ("cls");
                        cout << "\n\nESTE NOMBRE YA EXISTE!!!" << endl;
                        cout << "\n\nFAVOR DIGITAR OTRO NOMBRE DE ESTUDIANTE DIFERENTE\n" << endl;                                          
                        system("pause");
                        system ("cls");
                        } cont=0;
                  }while(cont>0);                           
                               
                 vEstudiante.push_back(cEstudiante(NomEst));
                 if(j==1) {
                 vEstudiante.erase(vEstudiante.begin()+i);
                  }
                 j=0;                            
                 break;
                 
     case 2:
                   system ("cls");
                   cout << "\nAQUIEN DESEA BORRAR :\n ";
                   cin >> PosNom;
                      for (i=0;i<run;i++){      //for inicio
                       cEstudiante runEstudiante = vEstudiante[i];      
                       if(runEstudiante.nomv == PosNom){
                          k++;                   
                          cout << "\n\nEL NOMBRE \n" << PosNom;
                          vEstudiante.erase(vEstudiante.begin()+i);
                  cout << " FUE BORRADO CON EXITO!!!\n" << endl;
                           }                         
                          }  //fin for
                         if(k==0){
                           cout << "\n ESTE NOMBRE NO EXITE  !!!\n" << endl;
                          }
                           k=0;
                           system("pause"); 
                           system(" CLS");                           
break;
     case 3:
   system ("cls");
                   run = vEstudiante.size();
                   cout << "\n\nNOMBRE: \n" << endl;
                                                     
                     for (i=0;i<run;i++){
                       cEstudiante PrintEstudiante = vEstudiante[i];
                         cout<<PrintEstudiante.nomv<<"\t "<<endl;
                        }
                         system("pause"); 
                         system ("cls");
break;
                 case 4:
                   system("cls");
                   cout<<"\n\nAQUIEN DESEA BUSCAR:  ";
                   fflush(stdin);
                   getline(cin, BusNom);
           
                   run = vEstudiante.size();
                   con=0;
                   system("cls");                
                   for (i=0;i<run;i++){      //inicio for
                     cEstudiante runEstudiante = vEstudiante[i];
                     if(runEstudiante.nomv == BusNom){
                     cout << "\nRESUTADO: \n\n" << endl;
                     cEstudiante PrintEstudiante = vEstudiante[i];
                     cout << "NOMBRE  " << " POSICION\n" << endl;
                     cout <<PrintEstudiante.nomv<<"\t #"<< i+1<< endl<< endl;
                     con++;          
                    system("pause");
                    }
                     }   // fin for
                   system("cls");
                     if(con==0) {
                     cout << "\nESTE NOMBRE NO EXISTE : \n\n" << endl;
                     system("pause");}
                     con=0;   
break;
                 case 0:
  sigue = 0;
break;
                 default:
                            cout<<"\t\tLA OPCION INGRESADA NO EXISTE\n";
                        system("cls");
}
} while(sigue);       
}



este es mi codigo quiero hacerlo mas eficiente, controlar los nombres en mayusculas y minusculas y todo eso porfa.

eferion

¿De verdad te preocupa la eficiencia de este código?

MellaSystems

Siii y mucho efeiron


Enviado desde mi iPhone utilizando Tapatalk

eferion

Pero vamos a ver... ¿cuánto puede tardar en ejecutarse este código? ¿Media milésima de segundo? ¿una milésima?

Vamos, a no ser que estés cargando una base de datos con 200.000.000.000 registros no creo que consigas notar diferencia alguna entre tu código y uno totalmente optimizado.

Pero tu mismo:

Los objetos pesados se pasan por referencia, no por valor.

Código (cpp) [Seleccionar]
cEstudiante(string vnomv) : nomv(vnomv){}

En esa línea estás creando un string temporal que, posteriormente, se usará para asignar el valor de "nomv". En tu código no vas a notar ningúna diferencia, pero es bastante más óptimo pasar los strings por referencia para evitar la creación de objetos temporales:

Código (cpp) [Seleccionar]
cEstudiante(const string& vnomv) : nomv(vnomv){}

No uses system

Las llamadas a "system" son muy lentas. Es mucho más eficiente programarte tu propia rutina que espere una pulsación del teclado.

Evita la copia innecesaria de objetos

Código (cpp) [Seleccionar]
cEstudiante runEstudiante = vEstudiante[i];

Ahí estás haciendo una copia de vEstudiante. Después de esa línea "runEstudiante" y "vEstudiante" son dos objetos independientes... estas copias consumen tiempo de ejecución y memoria.

Puedes evitar la copia usando referencias o haciendo uso de iteradores:

Código (cpp) [Seleccionar]
cEstudiante& runEstudiante = vEstudiante[i];

Código (cpp) [Seleccionar]

std::vector< cEstudiante >::iterator it, itEnd = vEstudiante.end( );
for (it = vEstudiante.begin( ); it != itEnd; ++it )
{
  if( it->nomv == NomEst)
    cont++;
}


fflush es solo para buffer de salida

Código (cpp) [Seleccionar]
fflush(stdin);

Esa línea tienes que evitarla a toda costa. fflush, de acuerdo con el estándar, está pensado para vaciar un buffer de salida, no un buffer de entrada. Dependiendo del sistema operativo esta línea te puede dar problemas.

Y con esto ya tienes algo con lo que empezar. Aunque no esperes notar demasiada diferencia... si tu programa hiciese cálculos matemáticos intensivos todavía... pero manejar un vector de 20 o 30 objetos...