#c #dictionary #comparison
#c #словарь #сравнение
Вопрос:
У меня есть интегральный тип, который представляет индекс кольцевого буфера. Функция сравнения less, определенная таким образом:
friend bool operator < (const CircularValue amp; lhs, const CircularValue amp;rhs) {
UInt max = lhs.value std::numeric_limits<UInt>::max() / 2;
return (lhs.value < max)
? rhs.value > lhs.value amp;amp; rhs.value < max
: rhs.value > lhs.value || rhs.value < max;
}
Lhs считается ниже rhs, если rhs выполняется в половине доступного интервала выше lhs.
Я хотел бы использовать его в map в качестве ключа, но не уверен, может ли это вызвать проблему. Он обладает свойством нерефлексивности и асимметрии, но не транзитивности.
Ответ №1:
Это вызовет проблемы. Как описано в cppreference, компаратор должен соответствовать следующим требованиям:
cmp(a,a)
выдаетfalse
- если
cmp(a,b)
выдает значение true, тоcmp(b,a)
выдаетfalse
- если
cmp(a,b)
==true
иcmp(b,c)
==, тоtrue
также должно бытьcmp(a,c)
(это не будет выполнено вашим компаратором).))))))))))) ваш компаратор)))))))))))))true
- если
a
иb
должны сравниваться равными, то обаcmp(a,b)
иcmp(b,a)
даютfalse