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