Zaawansowane CPP/Ćwiczenia 4: Testowanie: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
 
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> .
 

Wersja z 13:33, 1 wrz 2006