11.15.2006

STL: sí o no

Es muy común entre los que programamos en C++ el reinventar a menudo la rueda (incluso varias veces) y reprogramarse los contenedores básicos él mismo. Se suelen escudar en cuestiones de legibilidad de código, sobrecarga de llamadas, rapidez de ejecución. Es cierto que muchas veces es necesario tener muy claro como funciona algo, sobretodo con algortimos críticos sin embargo hay una serie de pros que me hacen decantarme por el uso de STL:

- efectividad: ganas tiempo en no tener que programar y hacer debug de tus contenedores. Además sabes que hay muchas más personas usándola y tienes cierta seguridad cuando las usas.

- rapidez de ejecución: es posible que tus contenedores sean más rápidos, pero en el tiempo que has usado para programarlos es posible que invitiéndolo en otros algortimos hubieras ganado más ciclos de cpu (o gpu :P).

- trabajos en equipo: cuando se trabaja en equipo es muy ventajoso que todo el grupo conozca muy bien las cosas básicas del código sobre el que se trabaja. Además casi nunca se suele estar de acuerdo en como deben funcionar los contenedores.

- Los iterators: te dan una versatilidad para cambiar de contenedor y trabajar con los mismos algortimos sobre cada uno bastante alta y que da aporta mucha efectividad a la hora de programar

pero también hay contras:

- No te evitas bugs... pero tampoco te libras de ellos si los programas tú. Por ejemplo hacer std::vector< std::vector > en algunas versiones de gcc (con la STL de GNU) tiene un bug.

- Código muchas veces ilegible, con lo cual hace difícil saber qué hacen exactamente.

- Múltiples implementaciones. Por un lado tienes la que traen por defecto los compiladores, STL de SGI, STL port. No es que sea un gran problema, pero hay contenedores y algortimos diferentes, ciertos detalles internos, etc.

- Los iterators: a algunos programadores les resulta engorroso tener que usar, por ejemplo, un iterator para eliminar un elemento de un std::vector

En resumen, para mi, STL sí, porque prefiero usar mi tiempo en crear algortimos diferentes a los de toda la vida, aunque creo que todo programador debería saber como implementar una lista enlazada o un vector. Tú que opinas?

9 comentarios:

Julio Gorgé dijo...

Yo maldigo a mis profesores de universidad cada vez que me obligan a hacer algo en C puro, porque lo primero que echo en falta antes es la biblioteca STL!

Creo que es suficientemente buena para programación generalista.. y que sólo se deberían usar sustitutos en casos extremos donde haga falta velocidad y control absoluto sobre la memoria(si, ya sé que están los allocators pero..). Si no me equivoco, los programadores de Java a veces tambien escriben sus propios contenedores, pero nuevo sólo en casos extremos.

Anónimo dijo...

"No te evitas bugs... pero tampoco te libras de ellos si los programas tú"

Eso no es un factor en contra...

"código ilegible"

¿En una libreria de collections ilegible? en c++ hay mil, casi todas iguales y perfectamente documentadas. E iguales a las de los otros lenguajes.

"Implementaciones diferentes"
Eso no es del todo cierto. Puede que línea a linea no sean iguales, pero algorítmicamente si. Una lista siempre es una lista. Y es una lista porque posee las características de una lista: velocidad de acceso, inserción o búsqueda perfectamente definidas.

"iterators"
Todas las funciones de los iteradores son accesibles por un tipo abstracto de dato siempre que la operación esté definida en el TDA. Pero usar el iterator (casi) siempre es una ventaja.

En resumen: No se te ocurra implementar TDAs. Pero tampoco se te ocurra ponerte a trabajar sobre uno sin tener conocimiento de lo que estas haciendo.

Saludos!

Anónimo dijo...

Hace tiempo ya que no toco C++. Uno de los problemas mas graves de la STL es trabajar con multihilo. Los contenedores no estan sincronizados (recordar que la STL trabaja siempre en heap) lo que supone que usar hilos con contenedores puede ser un auténtico infierno y dar muchos problemas de sincronización de datos (tienes que implementar tu mismo todos los bloqueos)

Y sí, provoca código ilegible. El problema de la STL es que su versatilidad permite hacer auténticas guarradas de código que luego no hay quien mantenga.

Unknown dijo...

Yo opino que, para mi vergüenza, no sé usar las STL. ¿Alguna documentación en castellano que me recomiendes, preferiblemente en plan libro impreso?
Tengo tantas cosas que leer... lo próximo con lo que me ponga, probablemente, el libro clásico de los patrones. Mientras más aprendes parece que menos sabes xD

Gorkinovich dijo...

Desde que uso las STL soy más feliz, así de simple. Porque sinceramente, dudo mucho que pueda yo programar algo mejor que esa librería en modo release.

Anónimo dijo...

Algunas veces son un coñazo, pero en general están muy bien. Yo los uso en el juego intensivamente y su rendimiento es excelente.

Anónimo dijo...

yo nunca he necesitado STL... De todos modos hacerte un kd-tree/arbol binario lleva 1 hora (en C puro, y con herencia incluida si hace falta) y hacer un array generico expandible (o estatico) lleva media [y aun no has cascado desde hace 2 anios] porque iba a marear la perdiz con librerias externas?

[sobre los bloqueos... si disenias con cuidado la aplicacion el numero de semaforos/criticalSections deberia ser minimo, y desde luego nunca en el acceso a un elemento de un contenedor - yo creo que si tienes un lock en un array o lista es que algo hay mal por ahi...]

Javi Santana dijo...

@anónimo: está claro que programar un vector dinámico se hace en 10 minutos (siempre que sepas hacerlo) y creo que todo el mundo debe hacerlo, sin embargo no es una cuestión de conocimiento, es una cuestión de eficiencia en el trabajo. Yo necesito una serie de contenedores y algortimos y STL me aporta todo (no solo vector, tb están las listas, queue, hash_map, map, priority_qeue) y me ahorro todo el tiempo que uso en programar y debuggear.

En conclusión, el uso de STL no lo veo como una simple decisión personal, creo que hay que hacer números, sobretodo con el tiempo que tienes para desarrollar un proyecto.

En cualquier caso estaría bien que comentases como haces herencia en C, aunque se salga un poco del tema :).

Gracias por los comentarios

Anónimo dijo...

ola, por ahi no es el lugar pero estoy desesperado, quisiera saber cual es la diferencia entre el map y el hashmap y cual estructura me comviene para armar un grafo, muchas gracias.