Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка массива структур, Передать функции сортировки поле 
:(
    Опции темы
Voldemar2004
Дата 25.4.2006, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



Предположим, я не знаю, по какому полю буду производить сортировку данных структуры. Соответственно указываю 
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;
}
 


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Void
Дата 25.4.2006, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



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);
 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
DeadSoul
Дата 25.4.2006, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



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


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.