Сортировка массива структуры по 3м значения массива

#include <iostream>
#include <windows.h>
#include <algorithm>
#include <vector>
#include <string>
#include <cstdlib>
using namespace std;

#define N 2

struct Znak {
    string fam, name, znak;
    int date[3] = { 0 };
};

void printOutput(Znak ad) {
    cout << "Фамилия: " << ad.fam << endl;
    cout << "Имя: " << ad.name << endl;
    cout << "Знак зодиака: " << ad.znak << endl;
    cout << "Дата рождения: " << ad.date[0] << "." << ad.date[1] << "." << ad.date[2] << endl;
}

int main() {
    setlocale(LC_ALL, "Russian");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

    Znak user[N];
    for (int i = 0; i < N; i++) {
        cout << "Введите следующие данные: Фамилию, Имя, Знак Зодиака, Дату рождения:\n";
        cin >> user[i].fam >> user[i].name >> user[i].znak >> user[i].date[0] >> user[i].date[1] >> user[i].date[2];
    };

    for (int i = 0; i < N; i++) {
        printOutput(*user);
    };

    qsort(user, N, sizeof);



    system("pause");
    return 0;
}

Подскажите как можно реализовать сортировку массива user по полю дата рождения(массив из 3х элементов)?

Не могу понять как реализовать тут через qsort.

для qsort(user,N, ?,?)

(?)- не знаю какие параметры указать и как их написать


Ответы (2 шт):

Автор решения: Andrej Levkovitch

Так как вы хотите отсортировать массив структур вам необходимо определить операцию сравнения двух структур. Так как вы хотите отсортировать лишь по одному полю структуры, то операцию сравнения лучше не определять в структуре как operator<, а реализовать отдельно, вроде:

auto comparator = [](const Struct &first, const Struct &second) {
  if (first.val < second.val) {
    return true;
  }
  return false;
};

Однако, так как поле, по котором вы хотите сравнивать, это массив объектов то так сделать не получится. Придется сравнивать сначала первую пару чисел, потом вторую и наконец третью. Можно воспользоваться небольшой хитростью: оператор less для tuple сравнивает поочередно каждую пару значений, как раз как нам нужно

...
if (std::make_tuple(first.val[0], first.val[1], fist.val[2]) < std::make_tuple(second.val[0], second.val[1], second.val[2])) {
...

Ну а дальше остается лишь вызвать алгоритм сортировки для нашего массива

std::vector<Struct> arr;
...

std::sort(arr.begin(), arr.end(), comparator);
→ Ссылка
Автор решения: Mikhailo

С qsort как-то так:

int compar(const void * a_, const void * b_) {
    const Znak * a = (const Znak *)a_;
    const Znak * b = (const Znak *)b_;

    if (a->date[2] > b->date[2]) return 1;
    if (a->date[2] < b->date[2]) return -1;
    if (a->date[1] > b->date[1]) return 1;
    if (a->date[1] < b->date[1]) return -1;
    if (a->date[0] > b->date[0]) return 1;
    if (a->date[0] < b->date[0]) return -1;
    return 0;
}

qsort(user, N, sizeof(Znak), compar);

В функции сравниваем сначала год, потом месяц, потом день.

Но в С++ проще использовать sort.

→ Ссылка