C ++ stl :: búsqueda de mapas con estructuras
Frecuentes
Visto 825 veces
0
He estructurado la información de la tienda sobre el paquete ARP y necesito guardar la solicitud ARP y el paquete de respuesta juntos. Me gustaría usar std::map para esto, la clave y el valor asignado es esa estructura ARP, y usaría el operador de búsqueda para calcular la respuesta con la solicitud.
Mi pregunta es cómo puedo decir map::find para comparar solo algunos miembros de struct.
Ejemplo de lo que estoy tratando de describir
struct arp_packet : public packet_info
{
u_short type; // 0x0001 request
// 0x0002 reply
struct ipv4_address ip_sender;
struct ipv4_address ip_target;
};
Guardaría todas las solicitudes en un mapa como este
std::map<arp_packet*, arp_packet*>
Primero, el valor asignado es NULL, pero cuando llegue el paquete de respuesta, usaré el método de búsqueda para que coincida con la solicitud.
Entonces, ¿cómo debo lograr que el mapa tome como clave el arp_packet *, y en su caso tome el otro arp_packet * y lo haga coincidir usando ip_sender e ip_target?
1 Respuestas
7
A std::map
acepta hasta 4 parámetros de plantilla (los 2 últimos tienen valores predeterminados).
Estaría usando el tercer parámetro aquí: un funtor destinado a comparar dos claves.
struct ArpComparator {
bool operator()(arp_packet* const left, arp_packet* const right) {
// compare the fields you need here
}
};
typedef std::map<arp_packet*, arp_packet*, ArpComparator> ArpMap;
Tenga cuidado con la implementación de una adecuada operator()
semántica, debe coincidir con las propiedades matemáticas de <
notablemente antisimetría y transitividad.
respondido 10 mar '12, 15:03
Intenté esto pero no está haciendo lo que quiero Tal vez el mapa no sea adecuado para este problema. Lo que quiero es primero insertar en algún contenedor un arp_packet* y luego, si llega la respuesta, buscar en este contenedor su contraparte de solicitud. - Ene
@Jan: desafortunadamente, dado que no tengo idea de cómo identificas realmente el request
paquete de la reply
uno, es un poco difícil de responder. Sin embargo, parece que realmente no necesita un mapeo aquí, simplemente un contenedor de búsqueda, podría intentar std::set<arp_packet*, ArpComparator>
para retener los paquetes de solicitud en espera de una respuesta. - Matthieu M.
También probé el enfoque std::set, sin embargo, tampoco funciona como quiero, pero creo que eventualmente usaré el mapa y calcularé el hash simple del paquete y lo usaré como clave. Necesito enlazar la respuesta para solicitar la base de las direcciones ipv4 y dado que ipv4 usa 32 bits para representar la dirección, usaré unsigned long como hash. en la solicitud, el bit 0-31 será el objetivo de ip y el remitente de ip 32-63, en respuesta, el orden será inverso. Pero gracias por la información sobre el mapa y el comparador: Ene
@Jan: el número de bits en unsigned long
está definida la implementación y depende de la plataforma, mejor uso uint32_t
del encabezado C <stdint.h>
. Podrías usar eso como la clave del mapa, por cierto: std::map<uint32_t, arp_packet*>
. - Matthieu M.
Ese es un buen punto, sin embargo, uint32_t no es suficiente, uint64_t, por otro lado, es lo que necesita. Gracias. - Ene
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c++ map or haz tu propia pregunta.
Dado que está almacenando punteros sin procesar, simplemente necesita proporcionar un predicado que proporcione una comparación menor que adecuada para el tipo
arp_packet*
- Chad