|
|
Linia 1: |
Linia 1: |
|
| |
|
| ''Uwaga: przekonwertowane latex2mediawiki; prawdopodobnie trzeba wprowadzi� poprawki''
| |
|
| |
| {Klasy cech}
| |
|
| |
| W poprzednich rozdziałach przedstawiono mechanizm typów związanych
| |
| (czyli typedefów zagnieżdżonych wewnątrz klasy).
| |
| Jest on intensywnie wykorzystywany w STL, gdzie bardzo przydaje się
| |
| do pisania szablonów funkcji parametryzowanych typem iteratora (albo
| |
| pojemnika).
| |
| Zagnieżdżony wewnątrz tego typu typ związany <code><nowiki> value_type</nowiki></code> pozwala na
| |
| tworzenie pomocniczych zmiennych przechowujących przetwarzane wartości,
| |
| <code><nowiki> iterator_category</nowiki></code> pozwala wybrać odpowiednią wersję kodu,
| |
| i tak dalej.
| |
|
| |
| Technika typów związanych ma jednak dwie wady.
| |
| Po pierwsze, muszą być one podczepione pod klasę, a czasem możemy chcieć
| |
| uzyskać informacje na temat czegoś, co może być albo klasą, albo prostym
| |
| typem wbudowanym (patrz iteratory -- albo klasy, albo zwykłe wskaźniki).
| |
| Po drugie, lista przekazywanych informacji jest zamknięta; aby
| |
| coś dodać, trzeba mieć dostęp do kodu źródłowego i go zmodyfikować.
| |
| Rozwiązaniem obu problemów są szablony cechujące.
| |
|
| |
| '''Zadanie 1 '''
| |
| Zaimplementuj funkcję uogólnioną biorącą jako argumenty parę iteratorów,
| |
| i zwracającą najmniejszy z tego ciągu elementów.
| |
| Najpierw opracuj wersję wykorzystującą typ związany, a potem wersję
| |
| korzystającą ze standardowego szablonu cechującego <code><nowiki> iterator_traits</nowiki></code> .
| |
| Sprawdź działanie obu wersji na liście oraz na zwykłej tablicy.
| |
| Przypominajka: w obu przypadkach niezbędne będzie słówko kluczowe
| |
| <code><nowiki> typename</nowiki></code> .
| |
|
| |
| '''Zadanie 2 '''
| |
| Zapoznaj się z plikiem <code><nowiki> kategorie.cpp</nowiki></code> .
| |
| Jest w nim przedstawiony sposób selekcji jednej spośród kilku implementacji
| |
| algorytmu na podstawie możliwości oferowanych przez przekazany iterator;
| |
| w tym konkretnym przykładzie rozróżniamy dwie grupy: iteratory o swobodnym
| |
| dostępie oraz wszystkie inne.
| |
| Rozszerz kod tak, aby wybierana była jedna z trzech możliwości: swobodny
| |
| dostęp, dwukierunkowe, gorsze niż dwukierunkowe.
| |
|
| |
| '''Zadanie 3 '''
| |
| Opierając się na przykładowym kodzie z poprzedniego zadania zaimplementuj
| |
| wariantowy algorytm sortowania ciągów.
| |
| Dla iteratorów jednokierunkowych użyj sortowania przez prosty wybór (patrz
| |
| odpowiednie ćwiczenie w module 3);
| |
| dla tych o dostępie swobodnym użyj quicksortu.
| |
|
| |
| '''Zadanie 4 '''
| |
| Do jakichś bliżej nie znanych celów potrzebny jest sposób na odróżnianie
| |
| iteratorów będących zwykłymi, klasycznymi wskaźnikami od wszystkich
| |
| pozostałych.
| |
| Ponieważ biblioteka standardowa nie dostarcza odpowiedniego mechanizmu,
| |
| trzeba go samodzielnie stworzyć.
| |
| Zaimplementuj szablon cechujący o nazwie <code><nowiki> is_pointer</nowiki></code> , zawierający
| |
| składową boolowską <code><nowiki> value</nowiki></code> .
| |
|
| |
| '''Podpowiedź do zadania 4 '''
| |
| Stwórz ogólny szablon zawsze zwracający <code><nowiki> false</nowiki></code> , a potem wyspecjalizuj
| |
| go dla typów będących wskaźnikiem do czegoś i tam zwracaj <code><nowiki> true</nowiki></code> .
| |
|
| |
| '''Rozwiązanie 4 '''
| |
| Patrz plik <code><nowiki> czy_wsk.cpp</nowiki></code> .
| |