Сортировка массива объектов по string полю

70
09 декабря 2021, 18:10

Есть такой класс администратора

class Admin
{
public:
    Admin() {}
    Admin(string log, string pass): login(log), password(pass) {}
    ~Admin() {}
    string get_login() { return login; }
    string get_password() { return password; }
    static int a_Login(string Login, string Password);
    static void a_Menu();
    static void a_print();
    static void a_delete();
    static void a_add();
    static void a_edit();
    static void a_sort(int ascend=1);
    static void load_data();
    static void read_admins();
    static void write_admins();
    static string current_admin;
protected:
    static int ascend_comp_login(const void* a, const void* b);
    static int descend_comp_login(const void* a, const void* b);
    string login, password;
};

И такие компараторы и сам метод, который вызывает qsort

int Admin::ascend_comp_login(const void* a,const void* b)
{
    string l = ((Admin*)a)->get_login();
    string r = ((Admin*)b)->get_login();
    return l.compare(r);
}
int Admin::descend_comp_login(const void* a, const void* b)
{
    string l = ((Admin*)a)->get_login();
    string r = ((Admin*)b)->get_login();
    return r.compare(l);
}
void Admin::a_sort(int ascend)
{
    if (ascend) qsort(&admins, admins.size(), sizeof(Admin), ascend_comp_login);
    else qsort(&admins, admins.size(), sizeof(Admin), descend_comp_login);
    Admin::a_print();
}

admins это вектор типа vector<Admin>

После таких преобразований сначала в войд, а потом обратно в админ, видимо, теряется инфа т.к. геттер возвращает либо рандомный мусор, либо пустую строку

Как это исправить, что бы по итогу использовать qsort ?

Answer 1

вы передаете в функцию указатель на сам вектор, а не на данные вектора. Используйте vector::data

qsort(admins.data(), ...); 

также рассмотрите вариант использования алгоритмов сортировки из <algorithm> на итераторах, std::sort

READ ALSO
Как найти длину гипотезузы?

Как найти длину гипотезузы?

найти значения длины гипотенузы в прямоугольном треугольнике с целыми сторонами, если 1 из катетов (H) Н-простое числоH=(2<=H<=10^4)

147
Не могу понять, почему ругается компилятор

Не могу понять, почему ругается компилятор

Решил попробовать создать двоичный тип данных для вводимых чисел, а также функции конъюнктирования и дизъюнктирования к нимОднако в какой-то...

87