У вас хорошая структура, за исключением того, что вы можете добавить перегрузку operator<
для сравнения.Здесь я делаю сравнение «сравни по имени, затем по дате»:
// Add this as a member function to `entry`.
bool operator<(entry const &other) const {
if (name1 < other.name1)
return true;
if (name1 > other.name1)
return false;
// otherwise name1 == other.name1
// so we now fall through to use the next comparator.
if (date < other.date)
return true;
return false;
}
[Редактировать: то, что требуется, называется «строгим слабым порядком».Если вы хотите вникнуть в подробности о том, что означает и какие альтернативы возможны, Дейв Абрахамс написал довольно подробный пост о C ++ Next об этом.
В приведенном выше случае мы начинаемсравнивая поля name1 из двух.Если a<b
, то мы немедленно возвращаем true.В противном случае мы проверяем a>b
и, если так, возвращаем false.В этот момент мы исключили a<b
и a>b
, поэтому мы определили, что a==b
, и в этом случае мы проверяем даты - если a<b
, мы возвращаем true.В противном случае мы возвращаем false - либо даты равны, либо b>a
, что означает, что проверка для a<b
является ложной.Если сортировке нужно разобраться (без каламбура), какой из этих случаев имеет место, она может снова вызвать функцию с заменой аргументов.Имена по-прежнему будут одинаковыми, поэтому все равно будут сводиться к датам - если мы получим false, даты будут равны.Если мы получим истинное значение на свопированных датах, то то, что началось со второй даты, на самом деле больше.]
operator<
, который вы определяете в структуре, определяет порядок, который будет использоваться по умолчанию.Когда / если вы хотите, вы можете указать другой порядок для сортировки:
struct byid {
bool operator<(entry const &a, entry const &b) {
return a.id_number < b.id_number;
}
};
std::vector<entry> entries;
// sort by name, then date
std::sort(entries.begin(), entries.end());
// sort by ID
std::sort(entries.begin(), entries.end(), byid());