0

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

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

4

2 回答 2

2

我认为您的问题缺乏明确性。假设您的意思是:

  1. std::map 中的是指向类的指针。这些是其他未指定的值。
  2. 尽管您使用的是有序关联容器,但您并不真正关心密钥的存储顺序,因为您只会进行精确查找。

在这种情况下,按地址比较指针就可以了。但是,对于这个用例,您可能希望使用unordered_mapC++11 中正式可用的(也称为哈希表),但通常在 C++ 库中可用,即使是 C++03。

于 2012-11-01T04:30:49.350 回答
2

map 基于 key 的弱等价性存储和检索值。假设您在映射 m1 中查找键 k1 - (因为映射实现为平衡 b 树)搜索将从根节点开始并根据节点处的值小于或大于 k1 向左或向右进行k1。如果 "value_at_node < k1" 和 "k1 < value_at_node" 比较结果为假,则映射得出结论,即在当前节点处找到了键。

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

比较器应该很好地符合弱等价规则 - !(v < k) && !(k < v) 与 v == k 相同。这应该由定制的比较器正确实施和维护。

于 2012-11-01T04:50:46.677 回答