Под капотом, 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;
}
Cryptic. Бонусные очки, если вы можете сказать мне, как моя функция сравнения заканчивается тем, что используется в _M_impl._M_key_compare
без очевидного цикла.