Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Сортировка массива структур


Автор: Voldemar2004 25.4.2006, 21:31
Предположим, я не знаю, по какому полю буду производить сортировку данных структуры. Соответственно указываю 
T1 Sort(T1 f[i], T2 Pole), где Pole - поле структуры, по которому будет происходить сортировка.

Идее не дает работать компилятор. Может мне кто-нибудь объяснить, что я не так делаю?
Код
//---------------------------------------------------------------------------
#include <iostream.h> // cout, cin
#include <conio.h>    // getch
#include <string.h>   // strcmp

struct tVipusknik
{
char Fam[20];
char Name[20];
char Otch[20];
char VUZ[20];
char Spec[20];
int GOD;
};

tVipusknik f[50];

template <class T1, class T2>
T1 Sort(T1 f[i], T2 Pole)
{
int Stud_Count;
int m=Stud_Count;

        do
        {
                for(int i=0; i<Stud_Count-1; i++)
                {
                        if(strcmp((f[i].Pole).c_str(), (f[i+1].Pole.c_str()))>0)
                        {
                        tVipusknik a = f[i];
                        f[i] = f[i+1];
                        f[i+1] = a;
                        }
                };
        m--;
        }
        while(m>0);
}

void Print_Student(int Stud_Count)
{
        for(int i=0; i<Stud_Count; i++)
        {
         cout<<f[i].Fam<<"\t"<<f[i].Name<<"\t"<<f[i].Otch<<"\t"<<f[i].VUZ<<"\t"<<f[i].Spec<<"\t"<<f[i].GOD<<"\n";
        }
}

int main(int argc, char* argv[])
{
int i;

        for(i=0; i<2; i++)
        {
        cout<<"\n"<<"Fam: "; cin>>f[i].Fam;
        cout<<"\n"<<"Name: "; cin>>f[i].Name;
        cout<<"\n"<<"Otch: "; cin>>f[i].Otch;
        cout<<"\n"<<"Vuz: "; cin>>f[i].VUZ;
        cout<<"\n"<<"Spec: "; cin>>f[i].Spec;
        cout<<"\n"<<"God okonchaniya: "; cin>>f[i].GOD;
        };

        Sort(f[i], Fam);

        Print_Student(2);

getch();
return 0;
}
 

Автор: Void 25.4.2006, 21:55
Voldemar2004, здесь есть два варианта:
1) Общепринятый: передавать в качестве параметра функции сортировки функтор сравнения:
Код

template <typename T, typename F>
void sort(T *a, size_t length, const F &compare) {
...
    if (compare(a[i], a[j]) { ... }
...
}

struct A {
    int member1, member2;
};

bool compare(const A &x, const A &y) {
    return x.member1 < y.member1;
}

sort(a, length, compare);

2) Специфичный, по твоему заказу smile Передавать в качестве параметра указатель на член:
Код

template <typename T, typename M>
void sort(T *a, size_t length, M (T::*member)) {
...
    if (a[i].*member < a[j].*member) { ... }
...
}

struct A {
    int member1, member2;
};

sort(a, length, &A::member1);
 

Автор: DeadSoul 25.4.2006, 22:02
Варианты:
1. Передавать в функцию sort указатель на функцию для сравнения. Прототип данной функции int compare(const tVipusknik&,const tVipusknik&)
2. Использовать boost 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)