Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Previous revision Next revision | Previous revision | ||
stable_sort [2008/12/10 21:05] vtech |
stable_sort [2008/12/10 22:26] vtech |
||
---|---|---|---|
Linia 7: | Linia 7: | ||
<code cpp> #include<algorithm> </code> | <code cpp> #include<algorithm> </code> | ||
- | ===== Deklaracja for_each ===== | + | ===== Deklaracja stable_sort ===== |
<code cpp> template <class RandomAccessIterator> | <code cpp> template <class RandomAccessIterator> | ||
void stable_sort ( RandomAccessIterator first, RandomAccessIterator last ); | void stable_sort ( RandomAccessIterator first, RandomAccessIterator last ); | ||
Linia 29: | Linia 29: | ||
===== Przykład użycia ===== | ===== Przykład użycia ===== | ||
<code cpp> | <code cpp> | ||
+ | przykład użycia algorytmu stable_sort - książka telefoniczna | ||
#include <iostream> | #include <iostream> | ||
#include <algorithm> | #include <algorithm> | ||
Linia 43: | Linia 44: | ||
//konstruktor | //konstruktor | ||
rekord(string im, string nazw, string t):imie(im),nazwisko(nazw),tel(t) {}; | rekord(string im, string nazw, string t):imie(im),nazwisko(nazw),tel(t) {}; | ||
+ | //operator porównania wykorzystywany przez algorytm stable_sort | ||
+ | bool operator <( const rekord& b ) const | ||
+ | { | ||
+ | switch(comp_mode)//wybór sortowanego pola | ||
+ | { | ||
+ | case by_imie: if(imie.compare(b.imie)<0)return true; break; | ||
+ | case by_nazwisko: if(nazwisko.compare(b.nazwisko)<0)return true;break; | ||
+ | case by_tel: if(tel.compare(b.tel)<0)return true; break; | ||
+ | } | ||
+ | return false; | ||
+ | }; | ||
//operator wpisu do strumienia - dla wygody drukowania rekordu | //operator wpisu do strumienia - dla wygody drukowania rekordu | ||
friend ostream& operator<<(ostream& str,const rekord& source); | friend ostream& operator<<(ostream& str,const rekord& source); | ||
- | //operator porównania wykorzystywany przez algorytm stable_sort | ||
- | friend bool operator<(const rekord& a, const rekord& b); | ||
- | //funkcja porównująca w sposób odwrotny, podawana jako argument stable_sort | ||
- | friend bool comparator(const rekord& a, const rekord& b); | ||
}; | }; | ||
rekord::tryb rekord::comp_mode; //statyczna zmienna przechowująca sposób sortowania | rekord::tryb rekord::comp_mode; //statyczna zmienna przechowująca sposób sortowania | ||
- | //operator porównania wykorzystywany przez funkcję stable_sort | + | |
- | bool operator<(const rekord& a, const rekord& b) | + | |
- | { | + | |
- | switch(rekord::comp_mode)//wybór sortowanego pola | + | |
- | { | + | |
- | case rekord::by_imie: if(a.imie.compare(b.imie)<0)return true; break; | + | |
- | case rekord::by_nazwisko: if(a.nazwisko.compare(b.nazwisko)<0)return true;break; | + | |
- | case rekord::by_tel: if(a.tel.compare(b.tel)<0)return true; break; | + | |
- | } | + | |
- | return false; | + | |
- | }; | + | |
//funkcja porównująca w sposób odwrotny (zamiast operatora domyślnego) | //funkcja porównująca w sposób odwrotny (zamiast operatora domyślnego) | ||
//podawana jako trzeci argument algorytmu stable_sort | //podawana jako trzeci argument algorytmu stable_sort | ||
Linia 133: | Linia 131: | ||
//podamy jawnie funkcję używaną do porównania | //podamy jawnie funkcję używaną do porównania | ||
//aby uwidocznić działanie tej funkcji odwraca ona sposób działania | //aby uwidocznić działanie tej funkcji odwraca ona sposób działania | ||
- | //operatora porównania (działa jak poerator >) co umożliwia sortowanie w porządku malejącym | + | //operatora porównania (działa jak operator >) co umożliwia sortowanie w porządku malejącym |
//jest to rozwiązanie bardziej przejżyste niż przypisanie operatorowi < działania | //jest to rozwiązanie bardziej przejżyste niż przypisanie operatorowi < działania | ||
//właściwego dla operatora > | //właściwego dla operatora > |