Каковы требования параметра сравнения std::map в отношении строгого упорядочения?

#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