如果没有相等运算符,STL map :: find函数如何工作?

Jim*_*ker 16 stl map find

在引擎盖下,STL映射是一个红黑树,它使用其键的<运算符或用户提供的比较来计算元素插入的位置.

map :: find()返回与提供的键匹配的元素(如果存在任何匹配)

如果不使用相等运算符,它怎么能这样做呢?假设我的地图中包含密钥1,2,3和4.仅使用<,我可以看到键2应该在1之后,2之后和3之前.但我不知道2是否与2相同.

我甚至可以在/usr/include/c++/4.4.3/bits/stl_tree.h中看到find()只使用用户提供的比较函数:

template<typename _Key, typename _Val, typename _KeyOfValue,
       typename _Compare, typename _Alloc>
typename _Rb_tree<_Key, _Val, _KeyOfValue,
          _Compare, _Alloc>::iterator
_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
find(const _Key& __k)
{
  iterator __j = _M_lower_bound(_M_begin(), _M_end(), __k);
  return (__j == end()
      || _M_impl._M_key_compare(__k,
                _S_key(__j._M_node))) ? end() : __j;
}
Run Code Online (Sandbox Code Playgroud)

隐秘.如果你可以告诉我如何在_M_impl._M_key_compare没有明显循环的情况下最终使用比较函数,那么奖励积分.

Tre*_*edd 20

如果(a < b)false(b < a)false的话(a == b).这就是STL的find()工作方式.

  • 使用类似的逻辑,您可以使用just运算符<实现操作==,>,> =和<= (3认同)

Yog*_*ora 7

它用 !(a<b) && !(b<a)