2012-03-10 64 views
0

我有存储有关ARP数据包的信息的结构,我需要将ARP请求和应答数据包保存在一起。我想为此使用std :: map,密钥和映射值是该ARP结构,并且我将使用find操作符来计算带请求的答复。C++ stl :: map查找结构

我的问题是我怎么能说map :: find来比较struct中的一些成员。

的什么,我试图描述

struct arp_packet : public packet_info 
{ 
    u_short type; // 0x0001 request 
        // 0x0002 reply 

    struct ipv4_address ip_sender; 
    struct ipv4_address ip_target; 
}; 

我会节省这样

std::map<arp_packet*, arp_packet*> 

首先映射值在地图中的所有请求为NULL,但磨应答包

例子来自我会使用find方法来匹配请求。

那么我应该如何实现地图将arp_packet *作为关键字,并找到它需要另一个arp_packet *并使用ip_sender和ip_target匹配它?

+0

既然你存储原始指针,你只需要提供一个谓词,提供适当低于类型比较'arp_packet *' – Chad 2012-03-10 15:47:38

回答

7

A std::map最多接受4个模板参数(最后2个具有默认值)。

你会在这里使用第三个参数:一个仿函数用来比较两个键。

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; 

注意有关实现适当operator()语义,它应该匹配的<数学性质,特别是反对称传递

+0

我试过,但它没有做什么,我想 也许地图不适合这个问题。 我想要的是首先插入到一个容器中的一个arp_packet *,然后如果答复出现在这个容器中的请求副本。 – Jan 2012-03-10 16:58:11

+0

@Jan:不幸的是,由于我不知道你是如何确定'reply'中的'request'包的,所以很难回答。看起来虽然你并不真的需要一个映射,只是一个可搜索的容器,你可以尝试使用'std :: set '来保存等待回复的请求数据包。 – 2012-03-10 17:10:19

+0

也尝试了std :: set方法,但它也不能按我的要求工作,但我认为我将最终使用map,并且我将计算来自数据包的简单哈希并将其用作关键字。我需要绑定回复请求基于ipv4地址,因为ipv4使用32位来表示地址,我将使用无符号long作为散列。 在请求的0-31位将是IP目标和32-63 IP发件人,在回复的顺序将是相反的。 但是,感谢关于地图和比较器的信息 – Jan 2012-03-10 17:23:27