Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Que STL es recomendable ...

Iniciado por Pogacha, 22 de Enero de 2007, 09:03:10 PM

« anterior - próximo »

Pogacha

para mayor compatibilidad entre compiladores (VC6.0 - GCC 3/4) y ligero peso?

Yo basicamente uso: vector, stack, queue, heap, list, slist, map, hashmap
y muy lamentablemente la que viene con VC6.0 no tiene hashmap.

Opciones que vi:
STL Port.
STL SGI.

Saludos y gracias por adelantado.

Zaelsius

Yo me decantaría por STL-Port ya que

1) Esa sí la he usado y la de SGI no
2) No está abandonada

Pogacha

Mi duda mas que nada es por que la de SGI debe ser ligera y tiene lo que tenia.
También puede que haya otra mas que no conozca.

Bue, tendré que probar como me va entonces.

Saludos

tamat

la STL-Port lo malo que tiene es que linka dinamicamente, lo cual implica arrastrar una DLL.
Por un stratos menos tenso

Pogacha

Cita de: "tamat"la STL-Port lo malo que tiene es que linka dinamicamente, lo cual implica arrastrar una DLL.
No estoy seguro de eso ...
Creo que la gran diferencia con otras es que linkea estaticamente con la parte de streams.

Bueno, tengo las dos instaladas STLPort y la de SGI. la STLPort me pide el service pack 5, el cual no se si tengo.  Asi que instale la de SGI tambien para ir intercalando en las pruebas.

Ya me encontré con dos o tres topetazos.
1 - La STL no tiene un simple associative container puro? ¿Por que no?
2 - Como hago para pasarle mi funcion de hashing a un hash_map?
tengo esto:
namespace N {
 class A { };
 class B {
      // A* es el key e int es el data si.
      std::hash_map<A*, int> mMap;
 };
};

No pude de ninguna forma, ni overloadando el hash<> ni pasandole nada.
Demas esta decir que no encontré ninguna referencia en inet. Si alguien me apunta se agradecera.

Saludos

AK47

1- Container asociativo estandar de las STL: std::map
2- std::map tiene su propia función de hashing
3- ¿Qué te dice el compilador? Ten en cuenta que el VC++ 6 es un poco petardo :P

Pogacha

Cita de: "AK47"1- Container asociativo estandar de las STL: std::map
2- std::map tiene su propia función de hashing
3- ¿Qué te dice el compilador? Ten en cuenta que el VC++ 6 es un poco petardo :P

1-Si pero necesito que sea una lista donde los deje en el orden que los meto y que la busqueda sea lineal.
2-Pero necesito una funcion de hashing que me tome un puntero (por ejemplo (ptr>>4)
3-No lo tengo a mano :( y en realidad dudo de que este petando el compilador o sea qeu yo no se hacerlo.


Saludos

Vicente

Cita de: Pogacha
Cita de: "AK47"1-Si pero necesito que sea una lista donde los deje en el orden que los meto y que la busqueda sea lineal.
2-Pero necesito una funcion de hashing que me tome un puntero (por ejemplo (ptr>>4)
3-No lo tengo a mano :( y en realidad dudo de que este petando el compilador o sea qeu yo no se hacerlo.
Saludos

No me meto en el tema mucho, pero si es una hash, ¿hacer búsqueda lineal? Si lo metes en una hash es para tener la busqueda en O(1), no en O(N) (y a cambio despídete de que te garanticen orden alguno claro...). Un saludo!

Vicente

AK47

No se si he metido la gamba en mi respuesta 2, ya que std::map se basa en el operador "<" para montar el arbol, que al fin y al cabo es lo que hace, un arbol que puede recorrer en tiempo O(log n) en las busquedas. Por lo tanto no, no hay un contenedor asociativo que mantenga el orden de insercion de los objetos en las STL. Quizas en boost si, pero si usas VC++ 6 no se si te va a funcionar asi como asi...

En cuanto a lo de la busqueda lineal me he quedado como Vicente: que gracia tiene usar un contenedor asociativo si luego quieres hacer una busqueda lineal? Para eso create un std::vector con estructuras y lo recorres comparando el campo que quieras. La gracia del std::map es poder hacer cosas del tipo entidades["ogro muy feo"]->beurp(); :P

Pogacha

Es que necesito dos contenedores distintos :P
Uno que sea un hash_map y otro que sea una lista que asocie un key para su busqueda.
Lo del hash function todavia no lo solucioné, lo tengo harcodeado (reinterpret_cast<int>).
Saludos.

AK47

Pero un hash map no es acaso una lista que asocia keys?

Loover

¿Pogacha puedes explicar cual es el problema que quieres resolver exactamente? Para ver así si realemente estás escogiendo las estructuras de datos acertadas.

PD: Eso de querer un order de búsqueda linea O(N) (en vez de buscar un O(lg N) con un árbol balanceado) y que el key sea un puntero me despista.
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

Pogacha

Bueno, vamos de nuevo. A ver si escogo palabras mas apropiadas esta vez.

Yo tenia mis containers hechos por mi basados en templates, pero luego de esto y algunas pruebas de rendimiento decidí pasarme a los containers de la STL.

Mis containers estaban adaptados a mis necesidades, uno de ellos era una lista donde podias buscar por un key, la cual hacia una busqueda lineal, lo importante era mantener el orden, (ahora tendré que hacer dos referencias: un map para buscar por el key y una lista para tener el orden) la cantiadad de elementos era menor a 6 y el primero era el mas frecuente por lo que un map es ligeramente ineficiente (aun que es lo mismo a fines practicos, lo que si me molesta es o tener que crear un functor para usar en la list::find o tener que usar dos refencias).

Otro de los containers utilizado en el proceso de serialización devuelve un id unico para cada puntero. Aqui el mapa hash que tiene como key un puntero.

Supuestamente el hash_function es un parametro de la hashmap y tiene como por defecto la clase template<class T> class hash<T>; pero no me permite especializarla:
template<> struct hash<MiClase*> {
 size_t operator()(const MiClase* &p) const {
       return reinterpret_cast<size_t>(p)/31;
 }
};

me un error absurdo que no puede convertir el puntero en (const int &) (tanto en SGI como STLPort )

tampoco puedo pasarle una función

size_t computeHash(const MiClase* &p) {
       return reinterpret_cast<size_t>(p)/31;
 }

Y obtengo el mismo error.

Ese es el mayor problema actual.
Saludos

PD: de mas esta decir que no he encontrado ningun ejemplo de como usar un hash_map con un key que sea una clase propia.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.