我正在使用std::map
存储指向我用来包装不同类型对象的类的指针。它用于表示Lua脚本语言以及其他Lua类型的表。当我创建表包装器时,我意识到std::map
在将指针存储在树中时会使用默认比较器。起初这对我来说似乎是一个问题,但后来我又考虑了一些并决定它不会。无论默认比较是什么,它都不重要(我认为)。
所以,我问的是这个。这是不是真的重要,如果是这样,何时会想要使用自定义比较器?
答案 0 :(得分:2)
我认为你的问题缺乏一点清晰度。我们假设你的意思是:
在这种情况下,按地址比较指针很好。但是,对于此用例,您可能希望使用unordered_map
(也称为哈希表),在C ++ 11中正式提供,但通常在C ++库中可用,即使对于C ++ 03也是如此。
答案 1 :(得分:2)
映射存储并根据密钥的弱等价来检索值。假设当您在地图m1中查找关键字k1时 - (因为地图实现为平衡的b树),搜索将从根节点开始并根据节点上的值小于k1或大于K1。如果“value_at_node< k1”和“k1< value_at_node”比较都产生错误,那么地图会断定在当前节点找到密钥。
如果key是指针类型,则指针值由默认比较器进行比较。指针值的弱等价与强等价(=运算符)具有相同的结果。如果对密钥位置(内存中的地址)进行的密钥比较不是您想要的,而是希望根据地址上的值进行比较,那么应该使用自定义比较器。就此而言,任何没有<运算符定义的地图容器不能使用 - 会有编译错误。
比较器应与弱等效规则一致 - !(v