【问题标题】:C++ stl::map find with structsC++ stl::map 使用结构查找
【发布时间】:2012-03-10 15:37:47
【问题描述】:

我有存储 ARP 数据包信息的结构,我需要将 ARP 请求和回复数据包一起保存。我想为此使用 std::map,键和映射值是那个 ARP 结构,我将使用 find 运算符对请求的回复进行数学运算。

我的问题是如何说 map::find 仅比较结构中的一些成员。

我要描述的示例

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 * 作为键,并在 find 它会采用另一个 arp_packet * 并使用 ip_sender 和 ip_target 匹配它?

【问题讨论】:

  • 由于您存储的是原始指针,您只需提供一个谓词,为arp_packet* 类型提供适当的小于比较

标签: c++ map


【解决方案1】:

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() 语义,它应该匹配&lt; 的数学属性,尤其是反对称传递性

【讨论】:

  • 我试过这个,但它没有做我想要的也许地图不适合这个问题。我想要的是首先在某个容器中插入一个 arp_packet*,然后如果收到回复,则在此容器中查找其请求对应项。
  • @Jan:不幸的是,因为我不知道你是如何从reply 中识别出request 数据包的,所以很难回答。看来您在这里并不需要真正的映射,只需要一个可搜索的容器,您可以尝试std::set&lt;arp_packet*, ArpComparator&gt; 保留等待回复的请求数据包。
  • 也尝试了 std::set 方法,但是它也不能按我的意愿工作,但我认为我最终会使用 map 并且我将从数据包中计算简单的哈希并将其用作关键。我需要根据 ipv4 地址绑定对请求的回复,并且由于 ipv4 使用 32 位来表示地址,因此我将使用 unsigned long 作为哈希。在请求中,0-31 位将是 ip 目标和 32-63 ip 发送者,作为回复,顺序将相反。但是感谢您提供有关地图和比较器的信息
  • @Jan:unsigned long 中的位数是实现定义的,取决于平台,最好使用 C 头文件&lt;stdint.h&gt; 中的uint32_t。顺便说一句,您可以将其用作映射键:std::map&lt;uint32_t, arp_packet*&gt;
  • 这很好,但是 uint32_t 还不够,另一方面 uint64_t 正是它所需要的。谢谢。
猜你喜欢
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
相关资源
最近更新 更多