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:03] 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 17: | Linia 17: | ||
| ===== Parametry ===== | ===== Parametry ===== | ||
| - | * first - pierwszy element kontenera | + | * //first// - pierwszy element kontenera |
| - | * last - element za ostatnim w kontenerze | + | * //last// - element za ostatnim w kontenerze |
| - | * comp - operator binarny relacji odpowiadający operatorowi <. Funkcja lub funktor postaci: bool comp(const <typ> &a,const <typ> &b) zwracająca ''true'' jeśli a<b (element a leży przed elementem b w ustalonym porządku logicznym) oraz ''false'' w przeciwnym przypadku. | + | * //comp// - operator binarny relacji odpowiadający operatorowi //<//. Funkcja lub funktor postaci: //bool comp(const <typ> &a,const <typ> &b)// zwracająca //true// jeśli a<b (element a leży przed elementem b w ustalonym porządku logicznym) oraz //false// w przeciwnym przypadku. |
| ===== Wartość zwracana ===== | ===== Wartość zwracana ===== | ||
| Linia 25: | Linia 25: | ||
| ===== Działanie ===== | ===== Działanie ===== | ||
| - | Wykonuje sortowanie elementów kontenera w porządku ustalonym przez operator < (domyślnie rosnący) lub operator comp. | + | Wykonuje sortowanie elementów kontenera w porządku ustalonym przez operator < (domyślnie rosnący) lub operator //comp// podany jako argument. |
| ===== 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 > | ||