Как работает функция STL map :: find без оператора равенства? - PullRequest
16 голосов
/ 13 июля 2010

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

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

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

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

Ответы [ 2 ]

20 голосов
/ 13 июля 2010

Если (a < b) равно false, а (b < a) равно false, то (a == b).Вот как работает STL find().

7 голосов
/ 13 июля 2010

Используется !(a<b) && !(b<a)

...