STL Map - 何时使用自定义比较器?

时间:2012-11-01 04:25:35

标签: c++ map

我正在使用std::map存储指向我用来包装不同类型对象的类的指针。它用于表示Lua脚本语言以及其他Lua类型的表。当我创建表包装器时,我意识到std::map在将指针存储在树中时会使用默认比较器。起初这对我来说似乎是一个问题,但后来我又考虑了一些并决定它不会。无论默认比较是什么,它都不重要(我认为)。

所以,我问的是这个。这是不是真的重要,如果是这样,何时会想要使用自定义比较器?

2 个答案:

答案 0 :(得分:2)

我认为你的问题缺乏一点清晰度。我们假设你的意思是:

  1. std :: map中的是指向类的指针。 是未指定的其他内容。
  2. 虽然您使用的是有序关联容器,但您并不关心密钥的存储顺序,因为您只会进行精确查找。
  3. 在这种情况下,按地址比较指针很好。但是,对于此用例,您可能希望使用unordered_map(也称为哈希表),在C ++ 11中正式提供,但通常在C ++库中可用,即使对于C ++ 03也是如此。

答案 1 :(得分:2)

映射存储并根据密钥的弱等价来检索值。假设当您在地图m1中查找关键字k1时 - (因为地图实现为平衡的b树),搜索将从根节点开始并根据节点上的值小于k1或大于K1。如果“value_at_node< k1”和“k1< value_at_node”比较都产生错误,那么地图会断定在当前节点找到密钥。

如果key是指针类型,则指针值由默认比较器进行比较。指针值的弱等价与强等价(=运算符)具有相同的结果。如果对密钥位置(内存中的地址)进行的密钥比较不是您想要的,而是希望根据地址上的值进行比较,那么应该使用自定义比较器。就此而言,任何没有<运算符定义的地图容器不能使用 - 会有编译错误。

比较器应与弱等效规则一致 - !(v