Как делает карту STL:: найти функции работу без оператора равенства?

Под капотом карта STL является красно-черным деревом, и это использует <оператор его ключей или обеспеченного пользователями сравнения для выяснения местоположения для вставки элемента.

карта:: найдите (), возвращает элемент, который соответствует предоставленному ключу (если какие-либо соответствия присутствуют),

Как это может сделать это, не используя оператор равенства? Скажем, моя карта имеет ключи 1, 2, 3, и 4 в ней. Используя только <я видел, что ключевые 2 должны следовать 1, после 2, и прежде 3. Но я не могу сказать, совпадает ли 2 с 2.

Я могу даже видеть в/usr/include/c ++/4.4.3/bits/stl_tree.h, которые находят (), использует только предоставленную пользователями функцию сравнения:

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 без очевидного цикла.

16
задан Jim Hunziker 13 July 2010 в 19:29
поделиться

2 ответа

Если (a является ложным и (b является ложным , затем (a == b) . Вот как работает find () из STL.

20
ответ дан 30 November 2019 в 21:18
поделиться

Он использует ! (A

7
ответ дан 30 November 2019 в 21:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: