Optimizar este código en C++

Iniciado por huchoko, 25 Octubre 2018, 02:50 AM

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

huchoko

Tengo este código, el cual funciona, pero tiene un error garrafal.

Código (cpp) [Seleccionar]

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>

typedef struct
{
int precio;
int id;
char name[255];
char adc[512]; // caracteristicas adicionales
} prod;

void addpr(prod *a);
void db(prod *a);

unsigned int pos = 0;
unsigned int nume = 0;

int main()
{
int op = 0;

// Necesitamos una estructura llamada pres y una llamada *punpress
// la cual apuntara a pres.
prod pres[512], *punpres; // <- creando 512 estructuras??? ineficiente!!!
punpres = pres;
do
{
printf("[1]A%cadir producto [3]Ver base de datos [4]Salir\n", 164);
std::cout << "-> ";
std::cin >> op;
switch (op)
{
case 1:
addpr(punpres);
break;
case 3:
db(punpres);
break;
case 4:
return 0;
default:
std::cout << "Opcion invalida!" << std::endl;
break;
}

} while (! std::cin.fail());
return 0;
}

void addpr(prod *estr)
{
fflush(stdin);
srand(time(NULL));
std::cout << "Inserte nombre del producto: ";
std::cin.getline(estr[pos].name, 100, '\n');
std::cout << "Inserte precio: ";
std::cin >> estr[pos].precio;
estr[pos].id = rand();
++pos;
++nume;
}

void db(prod *a)
{
for (pos = 0; pos < nume; ++pos)
{
printf("Nombre: %s\n", a[pos].name);
printf("Precio: $ %i\n", a[pos].precio);
printf("ID: %i", a[pos].id);
printf("\n------------------------\n");
}
}


En el mismo código se comenta el error, pues el cual es que estoy creando 512 estructuras, por lo cúal hay un límite de productos que se pueden ingresar. Pero me gustaría hacerlo dinámico, osea que el número de estructuras sea proporcional al número de productos. O(n)?
Ya le he tratado de hacer, con malloc, pero no era lo que buscaba...
Saludos :)
PD: Si compilo esto con g++, todo bien (también probé compilando con el standard C++11 y sigue funcionando), pero si compilo con cl (el compiler de VS Studio), al ejecutarlo y elegir la opción 1, se bugea y se salta el campo de ingresar nombre a ingresar precio.

elgilun

En C++ un array de dimensión dinámica es de preferencia un std::vector
https://es.cppreference.com/w/cpp/container/vector


huchoko

Cita de: elgilun en 25 Octubre 2018, 06:55 AM
En C++ un array de dimensión dinámica es de preferencia un std::vector
https://es.cppreference.com/w/cpp/container/vector


Me podrías dar un ejemplo con mi código?

elgilun

#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>

struct prod
{
prod(std::string name, int precio, int id)
: name{ name }
, precio{ precio }
, id{ id }
{}

int precio;
int id;
std::string name;
std::string adc; // caracteristicas adicionales
};

void addpr(std::vector<prod>& vProd);
void db(std::vector<prod>& vProd);

int main()
{
std::vector<prod> vProd; // el "array" de productos

// ...
// ... etcétera
// ...

// añadir producto:
addpr(vProd);

// ...
// mostrar productos:
db(vProd);
}

void addpr(std::vector<prod>& vProd)
{
std::string name;
int precio;

std::cout << "inserte nombre del producto: ";
std::cin >> name;
std::cout << "inserte precio: ";
std::cin >> precio;

vProd.emplace_back(name, precio, std::rand());
}

void db(std::vector<prod>& vProd)
{
for (const auto& i : vProd) {
std::cout << "mombre: " << i.name << '\n'
<< "precio: " << i.precio << '\n'
<< "ID: " << i.id << "\n------------------------\n";
}
}