вектор std :: sort недопустимого оператора структуры & lt;

У меня проблема с строгий слабый порядок в функции сравнения в 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 при сравнении часов, но затем я получаю «Отладочное утверждение не удалось!» с «Выражение: недопустимый оператор<».

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

1

Решение

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

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

  • 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;

… и так далее …

2

Другие решения

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

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

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

1

По вопросам рекламы [email protected]