Вектор std::sort оператора недопустимой структуры <

У меня проблема со строгим слабым упорядочением в функции сравнения в std::sort. Я не понимаю, почему это не получится.

У меня есть некоторые вложенные структуры:

struct date{
    int day = 1;
    int month = 1;
    int year = 2017;
};    
struct hhmmss{
    int hours = 1;
    int minutes = 1;
    int seconds = 1;
};    
struct dateAndTime {
   date d;
   hhmmss t;
};    
struct Trade
{
   /*
   other unrelevant data
   */
   dateAndTime timeClosed;
};

В моем коде, в какой-то момент у меня есть населенный пункт std::vector<Trade> который я хочу отсортировать.

Моя функция сортировки:

void sortTradesByDate(std::vector<Trade>& trades){
   std::sort(trades.begin(), trades.end(), compareDateAndTime);
}

Моя функция сравнения:

bool compareDateAndTime(const Trade& t1, const Trade& t2){
   if (t1.timeClosed.d.year < t2.timeClosed.d.year)
      return true;
   else if (t1.timeClosed.d.month < t2.timeClosed.d.month)
      return true;
   else if (t1.timeClosed.d.day < t2.timeClosed.d.day)
      return true;
   else if (t1.timeClosed.t.hours < t2.timeClosed.t.hours)
      return true;
   else if (t1.timeClosed.t.minutes < t2.timeClosed.t.minutes)
      return true;
   else if (t1.timeClosed.t.seconds < t2.timeClosed.t.seconds)
      return true;
   return false;      
}

При запуске функции и отладке мой первый элемент был передан compareDateAndTime() проходит после возврата истины на одно из утверждений (месяцев). Следующий элемент возвращает true при сравнении часов, но затем я получаю "Отладочное утверждение не удалось!" с "Выражение: недопустимый оператор<".

При поиске в Google это связано со строгим слабым упорядочением. Но почему это не удается при сравнении переменных int?

2 ответа

Решение

Ваша функция сравнения не реализует строгий слабый порядок

Рассмотрим этот сценарий:

  • t1: год =2017, месяц = ​​2
  • t2: год =2016, месяц = ​​5

compareDateAndTime(t1, t2) вернется true,

Вы должны приступить к сравнению month если и только если year та же.

if (t1.timeClosed.d.year < t2.timeClosed.d.year)
    return true;
if (t1.timeClosed.d.year > t2.timeClosed.d.year)
    return false;
if (t1.timeClosed.d.month < t2.timeClosed.d.month)
    return true;
if (t1.timeClosed.d.month > t2.timeClosed.d.month)
    return false;

... и так далее...

Хороший способ использовать стандартную библиотеку:

return std::tie(t1.timeClosed.d.year, t1.timeClosed.d.month) < std::tie(t2.timeClosed.d.year, t2.timeClosed.d.month);

Вы можете добавить отсутствующие элементы в std::tie (это шаблон с переменным числом аргументов). При этом используется оператор

Другие вопросы по тегам