在幕后,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;
}
隐秘。如果你能告诉我我的比较函数最终是如何在没有明显循环的情况下在_M_impl._M_key_compare
中使用的话,可以获得奖励积分。
答案 0 :(得分:20)
如果(a < b)
为false
且(b < a)
为false
,则为(a == b)
。这就是STL find()
的工作方式。
答案 1 :(得分:7)
它使用!(a<b) && !(b<a)