Эти опера­ции не потребуется программировать вручную в версии, которую мы об­судим в разделе 2.12.

Выражение равенства через отношение -«меньше»

Имеется еще один интересный аспект, относящийся к использованию С-указателей в качестве ключей. Когда в словаре происходит поиск по ключу, можно ожидать, что это осуществляется с помощью оператора эк­вивалентности —. Теперь предположим, что в нашей программе мы ищем в словаре имя "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


<< назад вперед >>