Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Chema en 28 de Mayo de 2008, 05:49:44 PM

Título: [C++] Custom key para un map STL
Publicado por: Chema en 28 de Mayo de 2008, 05:49:44 PM
Hola a todos,

Estoy teniendo problemas con un trozo de código y empiezo a sospechar de la "custom key" que uso para el map. La clave se compone de un puntero y un enum, el orden es primero segun el puntero, luego segun el enum:

struct PixelShaderSetupId {
IDirect3DPixelShader9* d3d_shader;
D3DCMPFUNC alpha_func;
PixelShaderSetupId() {
d3d_shader = 0;
alpha_func = D3DCMP_ALWAYS;
}
PixelShaderSetupId(IDirect3DPixelShader9* _d3d_shader, D3DCMPFUNC _alpha_func) {
d3d_shader = _d3d_shader;
alpha_func = _alpha_func;
}
bool operator<(const PixelShaderSetupId &b) const {
if((unsigned int)(d3d_shader) < (unsigned int)(b.d3d_shader))
return true;
else if((unsigned int)(d3d_shader) > (unsigned int)(b.d3d_shader))
return false;
else
return (unsigned int)(alpha_func) < (unsigned int)(b.alpha_func);
}
bool operator==(const PixelShaderSetupId &b) const {
return (d3d_shader == b.d3d_shader) && (alpha_func == b.alpha_func);
}
};


¿Veis algo incorrecto? Tengo un juego de pruebas bastante gordo y el código funciona el 99% de las veces, así que el fallo debe ser sutil.

Gracias,

Chema
Título: [C++] Custom key para un map STL
Publicado por: nostromo en 28 de Mayo de 2008, 09:06:36 PM
Hola, creo que debes darle al map una función binaria. Como ejemplo:


bool funcionCompara(double x, double y) { return fabs(x) < fabs(y); }


Cambiando double por el tipo de la clave(key) del map. Y el código de comparación claro.

Un saludo
Título: [C++] Custom key para un map STL
Publicado por: davur en 28 de Mayo de 2008, 11:37:54 PM
Normalmente no es necesario pasar una función de comparación a std::map, porque este último está declarado como (sección 23.3.1/2 del estándar):


namespace std {

template <class Key, class T, class Compare = less<Key>,
         class Allocator = allocator<pair<const Key, T> > >
class map {...};

} // namespace std


Y std::less devuelve el resultado de aplicar el operador menor-que.

Sin más información, es complicado responder sin recurrir a la mera especulación. Viendo el código me pregunto, por ejemplo, por qué en la implementación del operador menor-que de PixelShaderSetupId comparas enteros sin signo resultado de castings desde punteros a IDirect3DPixelShader9 [1] [2].

[1] Es conveniente notar (únicamente por completitud) que, de acuerdo con 5.2.10/5, "[...] mappings between pointers and integers are otherwise implementation-defined".

[2] Dicho sea de paso, puedes utilizar uno de los typedefs declarados en D3D9.h: LPDIRECT3DPIXELSHADER9 o PDIRECT3DPIXELSHADER9.