<General> usar la standard library o no?

Hola, Esto en realidad simplemente es una pequeña disertación no sabía donde ponerla pero creo que este lugar tendrá aceptación y sobre todo algo de discursión.

Cuando usamos un lenguaje como java nos damos cuenta de que lo que sobran son librerias que te permiten hacer casi cualquier cosa sin tener que hacerla tu a mano, es decir los bloques básicos de la programación te vienen dados y tu tienes que ensamblarlos para realizar construcciones más complejas. Es decir no te tienes que hacer tu socket seguro porque ya lo tienes hecho tu te encargas de enviar los datos de tu programa.

En mi caso cuando programo con qt no tengo ningún problema. Qt es libre, gratuito para particulares y además multi plataforma. Tiene opciones para tratar casi todos los aspectos del sistema operativo aunque pienso que te aisla un poco de la realidad. En fin pero para trabajar con dispositivos embebidos hasta hace poco no tenía ni la stl.

No se me ocurre porque una persona que utiliza día a día C++ no usa la stl. La única cosa es por eficiencia ya que por ejemplo los vector de stl son más lentos que un vector estático. Pero es mucho mejor que te gestione la memoria la stl que gestionarla tu mismo si lo que persigues es estabilidad en el software.

Pues el caso que veo yo es que ciertas personas que llevan mucho tiempo programando con algo y están tan acostumbradas a ello ( como en mi caso teniamos en un proyecto muy grande) una simple clase de vector de enteros y cuando querías tener más de un campo en el vector tenías que componer diferentes campos de enteros... ni hablar de vectores de cadenas. Todo esto por el miedo de tener que aprender algo nuevo... Hoy estaba gastando iteradores y como hace mucho tiempo que no los gastaba he tenido que mirar si el último elemento en si es un elemento del vector (el elemento end en realidad es un elemento vacio) y nada ha visto mi compañero un código algo así:

std:vector<Tipodato> vectorElementos;
std::vector<Tipodato>::iterator elemento;
for (elemento=vectorElementos.begin();elemento!=vectorElementos.end();elemento++){
hacer cosas
}

ya me decía que si eso el nolo entiende que si nosequé que si no secuantos... que pensais vosotros? usar una librería tan estandard como la stl y tal es bueno o es malo para una empresa. creeis que el código que he puesto ahí es dificil? si sabes lo que es un iterador y sabes algo de pattern design no tienes problemas.

yo la verdad es que cada día me sorprende más la industria del software en españa. Cuando programo no lo hago solo por ganarme la vida sino es algo que me gusta y tal. Pero he visto cosas... de máquinas de la competencia que si la apagas y la intentas encender se rompe, que pierden datos o que dan datos erroneos. Empresas que tienen bases de datos con inconsistencias.... increible es una vergüenza...

estoy desvariando mucho?

El caso es que me gustaría saber si pensais como yo y si creeis que se puede hacer algo para evitar esto? a nivel de formación? yo creo que en la universidad en programación me deberían haber enseñado un poco más a perder el miedo a librerias externas (yo no lo tengo) pero muchos de mis compañeros si... para que voy a hacer un zip si tengo la zlib? para perder tiempo?
ffelagund escribió:Te respondo brevemente: Usa la STL siempre que puedas. El codigo que has puesto no es en absoluto dificil de leer, pero si quieres hacerlo un poco mejor, usa typedefs para las colecciones, así mañana cambias de vector a lista y el codigo no cambia nada. Yo llevo muchos años programando en C++ (profesionalmente) y te aseguro que la STL, paral 90% de los casos es suficientemente rapida, si la sabes usars bien (por ejemplo es mas barato añadir un elemento a una lista que a un vector, como cosa básica)
Por cierto, en vez de elemento++, usa ++elemento. Ahorras una variable temporal creada por el compilador, con su consiguiente carga en su creacion, copia y asignacion, y para un iterador, eso puede ser significativo.

Ejemplo:
typedef std::vector< vertex > TVertexCollection;
.
.
.
TVertexCollection vertices;
.
.
.
TVertexCollection::iterator iter = vertices.begin();
for(; iter != vertices.end(); ++iter )
{
Foo();
}

P.D: por productividad, la mayor máxima de la informatica es no reinventar la rueda. Si hay una libreria que hace algo, y sabes que lo hace bien, y la puedes usar (ya sea por licencia, precio, etc), ÙSALA.
En mi proyecto actual, usamos librerias para cargar/salvar imagenes, para generacion de topologias de mallas, para inicializar las extensiones de opengl, usamos la stl, usamos boost, usamos .NET para widgets. Simplemente sin stl ni boost, nuestro proyecto estaría en una fase muchisimo menos avanzada.


lo de usar el typedef y lo del ++iterator tambien lo sabía simplemente quería reducir la dificultad del ejemplo. Yo creo desde mi punto de vista que se entiende de maravilla pero la gente no le gusta aprender a usar cosas de otros... yo era así cuando empecé la universidad. Pero ahora pienso que si tengo una librería a mano que me viene bien porque no la tengo que gastar?

tu proyecto tiene que ser interesante, yo estuve una temporada haciendo cosas de gráficos pero royo amateur... no se llega a saber tanto pero me lo pasaba bien jejeje. buscais gente? :P es coña ahora mismo no estoy interesado en curro.

Pero bueno gracias por tu respuesta seguramente les enseñe las respuestas de este foro en el trabajo a ver si de una vez por todas no me hacen programar con las manos atadas xDDD.
Lo que ya te han dicho, en el 90% de los casos la pérdida de rendimiento que supone usar STL no tiene mayor importancia, y con la de tiempo y dolores de cabeza que te ahorras compensa XD.

En el curro diles que prueben los vectores STL antes de decir si les conviene o no, y ya se convencerán ellos sólos [+risas].
por cierto, me da problemas el hecho de borrar elmentos del vector en un for, esto a que se debe?

yo lo que hago es el típico for con iteradores descrito anteriormente y poco el erase del iterador dentro. esto está mal? supongo que al eliminar el iterador dará algún problema al conseguir el siguiente de algo que se ha borrado? puede ser? he intentador poniendo iterator=vector.erase(iterator) y aún así no funciona.

un saludo
La funcion erase te devuelve la posicion al siguiente del borrado, por tanto si luego lo incrementas te lo saltas. Con lo cual si borras ya no tienes que hacer el incremento.

Si quieres borrar de cualquier posicion usa una lista en lugar de un vector( el vector tiene que mover todos los elementos posteriores al borrado y eso lo hace bastante menos eficiente).

Saludos.
5 respuestas