Cita:
Iniciado por lareto No quiero complicarle la vida a JarolGarcia con una versión más compleja que la que pueda asimilar, pero me parece que puede resultar interesante hacer una comparación entre una solución relativamente simple y artesanal, en estilo C (para lo que tomo como ejemplo y acomodando un poco la respuesta de eferion), y otra en estilo C++.
No era mi intención complicarle la vida... explico los pasos y pongo un código que, si bien funciona, no es algo típico que alguien pueda limitarse a copiar y pegar... tiene detalles que cantan.
La idea es que tenga un ejemplo que le sirva de base... pero al final tiene que ser él el que elabore una solución funcional.
Cita:
Iniciado por lareto Yo creo que el estilo C++ tiene una ventaja inmediata: es mucho más fácil pensar en una solución y esa solución es muy fácil de hacer eficiente, mientras que la solución en estilo C puede no ser difícil de pergeniar, pero es más difícil de hacer eficiente o, por lo menos, se necesita bastante más esfuerzo y reinventar varios paraguas para conseguir una solución equivalente. Mi idea es que para obtener una solución eficiente en C++ no hace falta ser demasiado inteligente, sólo estudiar un poco más.
Coincido contigo en parte.
En C se pueden conseguir soluciones mucho más eficientes que C++... pero ello te obliga a reinventar la rueda varias veces, lo cual pocas veces compensa, hasta aquí conforme.
Sin embargo eso de que para programar C++ no hace falta ser demasiado inteligente... es distinto. Creo que para controlar C++ tienes que pensar de forma más abstracta a como se hace con C, pero de ahí a insinuar que programar en C++ es más fácil...
Cita:
Iniciado por lareto Va el ejemplo de comparación, que espero pueda servirle a alguien.
He optimizado un poco tu función C++, lo cual refuerza la teoría de que con un buen diseño en C++ es más fácil aplicar optimizaciones (esta nueva versión es un 25% más rápida):
Código C++:
Ver originalstd::unordered_map<int, int> estilo_cpp(int N)
{
std::unordered_map<int, int> m; // las funciones devuelven un map para
// no tener que mostrar con cout
// los miles de valores
std::minstd_rand0 generator; // llena un vector con elementos al azar
std::vector<int> v;
v.reserve(N);
for(int i=0; i<N; ++i) {
v.push_back(generator()%N);
}
std::map< int, int > temp;
for( auto it = m.begin( ); it != m.end( ); ++it )
temp[ it->first ]++;
for( auto it = temp.begin( ); it != temp.end( ); ++it )
m[it->first] = it->second;
return m;
}
Un saludo.