sortowanie listy w STL

0

Wie ktos moze jak zrobic cos takiego:
Mam sobie klase, ktrora ma, imie nazwisko i numer ID w sobie, chcialbym liste tego moc sortowac, wedlug imienia, lub nazwiska, lub numeru (w menu jest odpowiednia opja), tylko, ze teraz, lista moze sie sortowac tylko poprzez zdefiniowany operator<, lub jakis obiekt funkyjny less<T>, ale nie rozumiem, na czym on mialby polegac

Moze ktos mial podobny problem??

Pozdro.

0

Hmmm sam nie wiem jak to jest z listami więc nie wiem czy to o to chodzi, bo jak wiem algorytmy sortowania z STL-a zwykle często i gęsto wykorzystują własność kontenerów którą jest możliwość skakania do dowolnego elementu a listy z tego co pamiętam jej nie mają :) Podaje więc przykład dla wektorów który BYĆ MOŻE zadziała dla listy.
Może troszke na innym przykładzie ale chyba przerobić będziesz sobie umiał.
Zakładamy że masz strukture opisującą punkt czyli dwie zmienne int X i Y. Teraz chcesz sortować najpierw patrząc na X a później wrazie równości X-ów na Y-eki. Więc Piszesz sobie funkcje która je porówna odpowiednio. Funkcja musi zwrócić wartość bool.

bool SORT(const punkt& a,const punkt& b)//Predykat do sortowania zbiorów
{
    if(a.x < b.x)
        return true;
    else if(a.x > b.x)
        return false;
    else if(a.x == b.x)
    {
        if(a.y < b.y)
            return true;
        else return false;
    }
}

W powyrzszym przykładzie struktura ta oczywiście nazwana była punkt :).
Teraz tylko wywołujesz sobie funkcje sortującą podając adres tej funkcji np tak:
sort(vector.begin(),vector.end(),SORT);

0

Dzieki pomoglo troche.
Tylko teraz jest inny problem, wychodza mi dziwne bledy w Visualu... strasznie zakrecone, wiec nie ma co cytowac, ale mam takie pytanie:

[???] Jakie operatory powinny byc przeladowane dla funkcji sort, lub stable_sort, bo nia tez probowalem, czy np. classe ktora mam na liscie powinienem wyposazyc w konstruktor kopiujacy?? i operator= ??

Pytam, bo jestem juz blisko i chcialbym w koncu sie dowiedziec o co tu chodzi...

Dzieki.
Pozdro.

0

do sortowania są odpowiednie funkcje, tyle że jak chcesz sortować wg ciągów to musisz przeciążyć operator porównania. Przykładu nie mam niestety pod ręką, jak znajde to zapodam :)

0

do sortowania są odpowiednie funkcje, tyle że jak chcesz sortować wg ciągów to musisz przeciążyć operator porównania. Przykładu nie mam niestety pod ręką, jak znajde to zapodam :)

Rozumiem, ale nie moge przeciazac operatora< kilka razy nie?? :) a potrzebuje porownywac wedlug roznych rzeczy, za kazdym, razem, gdy user wybierze w menu "wedlug numerow" to wedlug numerow, jesli "wedlug imion" to imiona porownuje... itp....
Wydaje mi sie, ze musze przeciazyc jakies takie rzeczy: operator=, kontruktor kopiujacy i funkcje swap napisac :/

Prosze o podpowiedz, jesli cos jeszcze mam zrobic...

Mam cos takiego:

void Database::GAutoSort(int i)
{



	switch(i)
	{
	case 1 :
		stable_sort(Gglowa, Gogon, GCheckByNumberUp());
		break;
	case 2 :
		stable_sort(Gglowa, Gogon, GCheckByNumberDown());
		break;
	case 3 :
		stable_sort(Gglowa, Gogon, GCheckByTypeUp());
		break;
	case 4 :
		stable_sort(Gglowa, Gogon, GCheckByTypeDown());
		break;
	case 5 :
		stable_sort(Gglowa, Gogon, GCheckByRPUp());
		break;
	case 6 :
		stable_sort(Gglowa, Gogon, GCheckByRPDown());
		break;
	case 7 :
		stable_sort(Gglowa, Gogon, GCheckByRLUp());
		break;
	case 8 :
		stable_sort(Gglowa, Gogon, GCheckByRLDown());
		break;
	}
	return;
}

tylko dalej mi sie pluje o jakies dziwne rzeczy typu:

--------------------Configuration: gzg - Win32 Debug--------------------
Compiling...
magazyn.cpp
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2784: 'class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> __cdecl std::operator +(_D,const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &)' : could not deduce template arg
ument for '' from 'class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator'
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterato
r,class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator,class GCheckByNumberUp,class Gazomierz ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2676: binary '+' : 'class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator' does not define this operator or a conversion to a type acceptab
le to the predefined operator
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterato
r,class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator,class GCheckByNumberUp,class Gazomierz ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2784: 'class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> __cdecl std::operator +(_D,const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &)' : could not deduce template arg
ument for '' from 'class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator'
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterato
r,class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator,class GCheckByNumberDown,class Gazomierz ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2676: binary '+' : 'class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator' does not define this operator or a conversion to a type acceptab
le to the predefined operator
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterato
r,class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator,class GCheckByNumberDown,class Gazomierz ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2784: 'class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> __cdecl std::operator +(_D,const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &)' : could not deduce template arg
ument for '' from 'class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator'
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterato
r,class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator,class GCheckByTypeUp,class Gazomierz ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2676: binary '+' : 'class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator' does not define this operator or a conversion to a type acceptab
le to the predefined operator
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterato
r,class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator,class GCheckByTypeUp,class Gazomierz ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2784: 'class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> __cdecl std::operator +(_D,const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &)' : could not deduce template arg
ument for '' from 'class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator'
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterato
r,class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator,class GCheckByTypeDown,class Gazomierz ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2676: binary '+' : 'class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator' does not define this operator or a conversion to a type acceptab
le to the predefined operator
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterato
r,class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator,class GCheckByTypeDown,class Gazomierz ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2784: 'class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> __cdecl std::operator +(_D,const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &)' : could not deduce template arg
ument for '' from 'class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator'
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterato
r,class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator,class GCheckByRPUp,class Gazomierz ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2676: binary '+' : 'class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator' does not define this operator or a conversion to a type acceptab
le to the predefined operator
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterato
r,class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator,class GCheckByRPUp,class Gazomierz ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2784: 'class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> __cdecl std::operator +(_D,const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &)' : could not deduce template arg
ument for '' from 'class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator'
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterato
r,class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator,class GCheckByRPDown,class Gazomierz ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2676: binary '+' : 'class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator' does not define this operator or a conversion to a type acceptab
le to the predefined operator
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterato
r,class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator,class GCheckByRPDown,class Gazomierz ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2784: 'class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> __cdecl std::operator +(_D,const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &)' : could not deduce template arg
ument for '' from 'class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator'
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterato
r,class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator,class GCheckByRLUp,class Gazomierz ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2676: binary '+' : 'class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator' does not define this operator or a conversion to a type acceptab
le to the predefined operator
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterato
r,class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator,class GCheckByRLUp,class Gazomierz ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2784: 'class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> __cdecl std::operator +(_D,const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &)' : could not deduce template arg
ument for '' from 'class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator'
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterato
r,class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator,class GCheckByRLDown,class Gazomierz ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2676: binary '+' : 'class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator' does not define this operator or a conversion to a type acceptab
le to the predefined operator
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterato
r,class std::list<class Gazomierz *,class std::allocator<class Gazomierz *> >::iterator,class GCheckByRLDown,class Gazomierz ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2784: 'class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> __cdecl std::operator +(_D,const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &)' : could not deduce template arg
ument for '' from 'class std::list<class Monter *,class std::allocator<class Monter *> >::iterator'
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Monter *,class std::allocator<class Monter *> >::iterator,clas
s std::list<class Monter *,class std::allocator<class Monter *> >::iterator,class MCheckByNameUp,class Monter ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2676: binary '+' : 'class std::list<class Monter *,class std::allocator<class Monter *> >::iterator' does not define this operator or a conversion to a type acceptable to
the predefined operator
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Monter *,class std::allocator<class Monter *> >::iterator,clas
s std::list<class Monter *,class std::allocator<class Monter *> >::iterator,class MCheckByNameUp,class Monter ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2784: 'class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> __cdecl std::operator +(_D,const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &)' : could not deduce template arg
ument for '' from 'class std::list<class Monter *,class std::allocator<class Monter *> >::iterator'
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Monter *,class std::allocator<class Monter *> >::iterator,clas
s std::list<class Monter *,class std::allocator<class Monter *> >::iterator,class MCheckByNameDown,class Monter ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2676: binary '+' : 'class std::list<class Monter *,class std::allocator<class Monter *> >::iterator' does not define this operator or a conversion to a type acceptable to
the predefined operator
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Monter *,class std::allocator<class Monter *> >::iterator,clas
s std::list<class Monter *,class std::allocator<class Monter *> >::iterator,class MCheckByNameDown,class Monter ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2784: 'class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> __cdecl std::operator +(_D,const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &)' : could not deduce template arg
ument for '' from 'class std::list<class Monter *,class std::allocator<class Monter *> >::iterator'
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Monter *,class std::allocator<class Monter *> >::iterator,clas
s std::list<class Monter *,class std::allocator<class Monter *> >::iterator,class MCheckBySurnameUp,class Monter ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2676: binary '+' : 'class std::list<class Monter *,class std::allocator<class Monter *> >::iterator' does not define this operator or a conversion to a type acceptable to
the predefined operator
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Monter *,class std::allocator<class Monter *> >::iterator,clas
s std::list<class Monter *,class std::allocator<class Monter *> >::iterator,class MCheckBySurnameUp,class Monter ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2784: 'class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> __cdecl std::operator +(_D,const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &)' : could not deduce template arg
ument for '' from 'class std::list<class Monter *,class std::allocator<class Monter *> >::iterator'
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Monter *,class std::allocator<class Monter *> >::iterator,clas
s std::list<class Monter *,class std::allocator<class Monter *> >::iterator,class MCheckBySurnameDown,class Monter ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2676: binary '+' : 'class std::list<class Monter *,class std::allocator<class Monter *> >::iterator' does not define this operator or a conversion to a type acceptable to
the predefined operator
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Monter *,class std::allocator<class Monter *> >::iterator,clas
s std::list<class Monter *,class std::allocator<class Monter *> >::iterator,class MCheckBySurnameDown,class Monter ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2784: 'class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> __cdecl std::operator +(_D,const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &)' : could not deduce template arg
ument for '' from 'class std::list<class Monter *,class std::allocator<class Monter *> >::iterator'
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Monter *,class std::allocator<class Monter *> >::iterator,clas
s std::list<class Monter *,class std::allocator<class Monter *> >::iterator,class MCheckByNumberUp,class Monter ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2676: binary '+' : 'class std::list<class Monter *,class std::allocator<class Monter *> >::iterator' does not define this operator or a conversion to a type acceptable to
the predefined operator
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Monter *,class std::allocator<class Monter *> >::iterator,clas
s std::list<class Monter *,class std::allocator<class Monter *> >::iterator,class MCheckByNumberUp,class Monter ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2784: 'class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> __cdecl std::operator +(_D,const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &)' : could not deduce template arg
ument for '' from 'class std::list<class Monter *,class std::allocator<class Monter *> >::iterator'
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Monter *,class std::allocator<class Monter *> >::iterator,clas
s std::list<class Monter *,class std::allocator<class Monter *> >::iterator,class MCheckByNumberDown,class Monter ** )' being compiled
c:\program files\microsoft visual studio\vc98\include\algorithm(629) : error C2676: binary '+' : 'class std::list<class Monter *,class std::allocator<class Monter *> >::iterator' does not define this operator or a conversion to a type acceptable to
the predefined operator
c:\program files\microsoft visual studio\vc98\include\algorithm(620) : see reference to function template instantiation 'void __cdecl std::_Insertion_sort_1(class std::list<class Monter *,class std::allocator<class Monter *> >::iterator,clas
s std::list<class Monter *,class std::allocator<class Monter *> >::iterator,class MCheckByNumberDown,class Monter ** )' being compiled
Error executing cl.exe.

gzg.exe - 28 error(s), 0 warning(s)

stad wlasnie wnioskuje, ze musze cos jeszcze napisac, tylko co??

Pozdro.

0

Dobra. Opiszę dokladniej o co chodzi:
Mam liste takich klas:

class Gazomierz 
{ 
public: 
   Gazomierz(); //+ 
   Gazomierz(char *_typ, char *_rokprod, char *_numer, char *_rokleg = 0, char *_stan = 0, char *_status= "brak"); //+ 
   ~Gazomierz();//+ 
   void ZmienStatus(char *s); //+ 
   void Modify(char* _typ, char* _rokprod, char* _numer, char *_rokleg = 0, char *_stan = 0, char *_status= "brak");//+ 
   void WriteToFile(fstream& plik); //+ 
   void ReadFromFile(fstream& plik);//+ 
   void Show(); //+ 
   char* Dane(); //+ 
   void ShowShort();//+ 

   char* getTyp(){ return typ;} 
   char* getRokP(){return rokprod;} 
   char* getRokL(){return rokleg;} 
   char* getNumer(){return numer;} 
   char* getStatus(){return status;} 
   char* getStan(){return stan;} 

   Gazomierz(Gazomierz &G); 

   Gazomierz& operator=(Gazomierz &prawy); 

private: 
   char typ[25]; 
   char rokprod[5]; 
   char rokleg[5]; 
   char numer[7]; 
   char stan[11]; 
   char status[11]; 
    
   char tab[70]; 
}; 

teraz w programie mam menu, ktore sortuje te liste:

void Database::GSort() 
{ 
   int option; 
   do 
   { 
      cout<<"Menu: Sortuj\n"; 
      cout<<"1. Wedlug numerow (rosnaco)\n" 
         <<"2. Wedlug numerow (malejaco)\n" 
         <<"3. Wedlug typow (rosnaco)\n" 
         <<"4. Wedlug typow (malejaco)\n" 
         <<"5. Wedlug rokow produkcji (rosnaco)\n" 
         <<"6. Wedlug rokow produkcji (malejaco)\n" 
         <<"7. Wedlug rokow legalizacji (rosnaco)\n" 
         <<"8. Wedlug rokow legalizacji (malejaco)\n" 
         <<"9. Powrot do poprzedniego menu\n"; 
      cout<<"Wybor: "; 
      cin>>option; 
   }while((option < 1) || (option > 9)); 
    
   Gkolejka = option; 

   GAutoSort(option); 
    
   return; 
}

przy pomocy funkcji GAutoSort:

void Database::GAutoSort(int i) 
{ 

   switch(i) 
   { 
   case 1 : 
      Magazyn.sort(GCheckByNumberUp());//Magazyn, to obiekt typu list<Gazomierz*> 
      break; 
   case 2 : 
/---- itd.... 

GCheckByNumberUp to klasa takiego typu:

class GCheckByNumberUp 
{ 
public: 
   GCheckByNumberUp(){}//pusto.... tak pisalo w ksiazce pewnej 
   bool operator()(Gazomierz *a, Gazomierz *b); 

}; 

jej definicja:

bool GCheckByNumberUp::operator ()(Gazomierz *a, Gazomierz *b) 
{ 
   if(strcmp(a->getNumer(), b->getNumer()) < 0) 
      return true; 
   else 
      return false; 
} 

niby wedlug tego, co przeczytalem gdzies w sieci powinno to dzialac, ale nie dziala... na stronie SGI jest cos, o tym, ze, moze ona powinna dziedziczyc po klasie bool_function<T,T, bool>, czy cos... ale jakos nie potrafie tam doczytac w tych specyfikacjach, bo troche są zakrecone...

Moze teraz ktos bedzie potrafil mi pomoc??

pozdrawiam.

0

RTFM

Ma być:

#include <algorithm>
#include <vector>
using namespace std;

class A
{
	int a;
};

bool Comparator(const A &a, const A &b)
{
    //... cos tam po swojemu	
    return false;
}

int main()
{
	vector<A> vv;
	
	stable_sort( vv.begin(), vv.end(), Comparator ); // !!!!!
}

A NIE:

#include <algorithm>
#include <vector>
using namespace std;

class A
{
	int a;
};


class Comparator
{
public:
	Comparator() {}
	bool operator()( A *a, A *b ) { return false; } // co to w ogóle jest?!
};

int main()
{
	vector<A> vv;
	
	stable_sort( vv.begin(), vv.end(), Comparator() );
}

Albo statyczna metoda np. static bool compare(...) w klasie i wtedy stable_sort( vv.begin(), vv.end(), JakasKlasa::compare );
</b>

0

class Comparator
{
public:
Comparator() {}
bool operator()( A *a, A *b ) { return false; } // co to w ogóle jest?!
};

To jest mój drogi funktor, inaczej obiekt funkcyjny.
(Choć w twoim przykładzie nic nie robi sensownego...).
Obiekty są używane zamiast wskaźników na funkcje... cały STL w zasadzie opiera się o obiekty funkcyjne....

A problem rozwiązałęm tak, że moje funktory dziedziczą po klasie greater<T>, kompiluje się to, tylko, nie wiem, jak działa, bo mam w paru miejscach wycieki pamięci, nie chce mi sie tego sprawdzać na razie, poza tym mam jeszcze niestety inne zajęcia :(

Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1