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