Выражение равенства через отношение -«меньше»
Имеется еще один интересный аспект, относящийся к использованию С-указателей в качестве ключей. Когда в словаре происходит поиск по ключу, можно ожидать, что это осуществляется с помощью оператора эквивалентности —. Теперь предположим, что в нашей программе мы ищем в словаре имя "John" и существует элемент словаря, содержащий этот ключ
"John". Каждый программист на С(++) должен знать, что такой поиск не может быть произведен с помощью оператора ==, поскольку приведет к сравнению адресов, а не самих строк. Вместо == необходимо использовать функцию strcmp. Например, при
char *s = "John", *t = "John";
выражения
s == t
strcmp(s, t) == 0
будут иметь значения 0 (=false) и 1 (=true) соответственно.
В нашей программе сравнение на равенство символьных ключей выполнятся правильно, потому что для этой цели используется класс compare. Если бы потребовалось сравнить два числа, а и Ь, мы могли бы выразить оператор == через <, заменив
а == Ь на
!(а < Ь II Ь < а)
Точно так же проверка на равенство двух ключей s и t типа char* осуществляется в нашей программе следующим образом:
!(compare()(s, t) II compare() (t, s))
Посмотрев на определение функции operatorQ в классе compare, мы увидим, что это эквивалентно
!(strcmp(s, t) < О II strcmp(t, s) < 0)
Хотя наше выражение вычисляется медленнее, оно, в свою очередь, эквивалентно
strcmp(s, t) == 0
<< назад вперед >>