STL地图如何知道,该地图包含给定元素?

时间:2012-09-08 14:41:11

标签: c++ stl map

在问题Using char as key in stdmap中,建议使用自定义比较函数/仿函数:

struct cmp_str
{
   bool operator()(char const *a, char const *b)
   {
      return std::strcmp(a, b) < 0;
   }
};

map<char *, int, cmp_str> BlahBlah;

这允许地图检测键A是否小于键B.但是例如 map&lt;&gt; :: find()返回结束如果找不到元素,如果找到则返回迭代器。因此,地图知道等价,而不仅仅是低于。怎么样?

3 个答案:

答案 0 :(得分:7)

两个键ab的相等条件是a<bb<a都是假的。地图本身通常实现为平衡二叉树 * ,因此小于比较用于从根节点遍历地图,直到找到匹配元素。在搜索键k时,使用小于比较,直到找到比较为假的第一个元素。如果反比较也为假,则找到k。否则,k不在地图中。地图仅使用与此目的相比较小的比较。

另请注意std::set使用完全相同的机制,唯一的区别是每个元素都是它自己的密钥。

* 严格来说,C ++标准没有指定std::map是一个平衡的二叉树,但它对插入和查找等操作的复杂性限制意味着实现选择了诸如红黑树之类的结构。

答案 1 :(得分:3)

等价/ operator==可以表示为operator<

的函数
bool operator==(T left, T right) {
  return !(left < right) && !(right < left);
}

答案 2 :(得分:3)

这是因为地图的比较器必须实现严格的弱排序,例如<

此类关系的一个数学属性是Antisymmetry,其中指出对于任何xynot (x < y)not (y < x)隐含{ {1}}。

因此,在找到第一个不比你要搜索的密钥小的元素之后,实现只是检查该元素是否比较大,并且它既不小也不大,那么它必须相等。