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] (aktualna) 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 > | ||