how cplusplus stl map find

stl - how - std:: map cplusplus



¿Cómo funciona STL map:: find sin el operador de igualdad? (2)

Si (a < b) es false y (b < a) es false , entonces (a == b) . Así es como funciona find() STL.

Debajo del capó, un mapa STL es un árbol rojo-negro, y utiliza el <operador de sus claves o una comparación proporcionada por el usuario para descubrir la ubicación para la inserción del elemento.

map :: find () devuelve el elemento que coincide con la clave proporcionada (si hay coincidencias presentes)

¿Cómo puede hacer esto sin usar un operador de igualdad? Digamos que mi mapa tiene las teclas 1, 2, 3 y 4 en él. Usando solo <, pude ver que la clave 2 debería ir después de 1, después de 2 y antes de 3. Pero no puedo decir si 2 es igual a 2.

Incluso puedo ver en /usr/include/c++/4.4.3/bits/stl_tree.h que find () no usa nada más que la función de comparación proporcionada por el usuario:

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; }

Críptico. Puntos de bonificación si puede decirme cómo termina mi función de comparación en _M_impl._M_key_compare sin un bucle obvio.


Utiliza !(a<b) && !(b<a)