En primer lugar, deshazte de la cuerda y usa 2 ints, que bien podrías haber hecho hasta ahora. Felicitaciones por descubrir que un árbol es la mejor manera de implementar una matriz dispersa. Por lo general, parece ser un imán para malas implementaciones.
FYI, una clave compuesta triple también funciona, y supongo que también un par de pares.
Sin embargo, hace algunas sub-secuencias de comandos feas, así que un poco de macro magia hará su vida más fácil. Dejé este propósito general, pero la creación de argumentos en la macro es una buena idea si creas macros para mapas específicos. El TresKey12
está probado y funcionando bien. QuadKeys
también debería funcionar.
NOTA: Siempre que sus piezas clave sean tipos de datos básicos, NO necesita escribir nada más. AKA, no hay necesidad de preocuparse por las funciones de comparación. El STL te tiene cubierto. Solo codifícalo y déjalo explotar.
using namespace std; // save some typing
#define DosKeys(x,y) std::make_pair(std::make_pair(x,y))
#define TresKeys12(x,y,z) std::make_pair(x,std::make_pair(y,z))
#define TresKeys21(x,y,z) std::make_pair(std::make_pair(x,y),z))
#define QuadKeys(w,x,y,z) std::make_pair(std::make_pair(w,x),std::make_pair(y,z))
map<pair<INT, pair<ULLNG, ULLNG>>, pIC_MESSAGE> MapMe;
MapMe[TresKey12(Part1, Part2, Part3)] = new fooObject;
Si alguien quiere impresionarme, me muestran cómo hacer un operador de comparación para TresKeys
que no se basa en los pares de anidación para que pueda utilizar una sola struct
con 3 miembros y utilizar una función de comparación.
PS: TresKey12 me dio problemas con un mapa declarado como par, z, ya que hace x, par, y esos dos no juegan bien. No es un problema para DosKeys o QuadKeys. Sin embargo, si es un verano caluroso el viernes, puede encontrar un efecto secundario inesperado al escribir DosEquis ... err .. Dos veces un par de veces, es una sed de cerveza mexicana. Caveat Emptor. Como dice Sheldon Cooper, "¿Qué es la vida sin extravagancia?".
Desde aquí se puede rellenar y legítimamente dos largos en un _int64, o como en mi respuesta a continuación, un número de serie, PID y NODEID. Como MAX_PID es (1 << 22) en Linux, esto realmente deja 64 - (32 + 22) para el NodeId, que es de 10 bits, manteniendo cualquier valor hasta (1 << 10) IE: 1024 – RocketRoy
Asumiendo que usted no desea repetir el mapa en un orden específico, utilice un mapa hash como std :: unordered_map. Mucho más eficiente especialmente cuando tienes tantos valores. – hyde