Под капотом карта 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
без очевидного цикла.
Если (a является
ложным
и (b является
ложным
, затем (a == b)
. Вот как работает find ()
из STL.