Сортировка массива структуры по 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 шт):
Так как вы хотите отсортировать массив структур вам необходимо определить операцию сравнения двух структур. Так как вы хотите отсортировать лишь по одному полю структуры, то операцию сравнения лучше не определять в структуре как 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);
С 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.