Zaawansowane CPP/Ćwiczenia 3: Szablony II: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Mirek (dyskusja | edycje)
Nie podano opisu zmian
Nie podano opisu zmian
 
Linia 7: Linia 7:
}}
}}
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
Patrz plik [http://osilek.mimuw.edu.pl/images/f/f2/Wypisywanie.cpp wypisywanie.cpp].
Patrz plik [[media:Wypisywanie.cpp | wypisywanie.cpp]].
</div></div>
</div></div>


Linia 16: Linia 16:
}}
}}
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
Patrz pliki [http://osilek.mimuw.edu.pl/images/d/d5/Kolejka.h kolejka.h] oraz [http://osilek.mimuw.edu.pl/images/4/46/Test_kolejki.cpp test_kolejki.cpp].
Patrz pliki [[media:Kolejka.h | kolejka.h]] oraz [[media:Test_kolejki.cpp | test_kolejki.cpp]].
</div></div>
</div></div>


Linia 33: Linia 33:
}}
}}
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
Patrz pliki [http://osilek.mimuw.edu.pl/images/a/a1/Tablica.h tablica.h] oraz [http://osilek.mimuw.edu.pl/images/f/f6/Test_tablicy.cpp test_tablicy.cpp].
Patrz pliki [[media:Tablica.h | tablica.h]] oraz [[media:Test_tablicy.cpp | test_tablicy.cpp]].
</div></div>
</div></div>


Linia 58: Linia 58:
}}
}}
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
Patrz plik [http://osilek.mimuw.edu.pl/images/e/e2/Zbior_malejacy.cpp zbior_malejacy.cpp].
Patrz plik [[media:Zbior_malejacy.cpp | zbior_malejacy.cpp]].
</div></div>
</div></div>


Linia 84: Linia 84:
}}
}}
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
Patrz plik [http://osilek.mimuw.edu.pl/images/7/77/Sortowanie.cpp sortowanie.cpp].
Patrz plik [[media:Sortowanie.cpp | sortowanie.cpp]].
</div></div>
</div></div>

Aktualna wersja na dzień 10:22, 2 paź 2006

Ćwiczenie 1

Jednym z poprzednich ćwiczeń było zaimplementowanie szablonu funkcji wypisz_na_cout(), biorącej jako argumenty parę iteratorów. Przeciąż ten szablon, definiując również wersje biorące iterator plus ilość elementów do wypisania oraz pojemnik STL.

Rozwiązanie

Ćwiczenie 2

Zaimplementuj szablon kolejki, używając jako klasy bazowej szablonu std::list<> .

Rozwiązanie

Ćwiczenie 3

Zaimplementuj szablon klasy Tablica, biorący jako argumenty nazwę typu oraz rozmiar tablicy. Jedynymi metodami udostępnianymi przez klasę powinny być set() oraz get(), dające dostęp do wskazanych elementów:

     Tablica<int, 10> t;
     t.set(0, 77);
     cout << t.get(9) << '\n';
     cout << sizeof(t) << '\n';   // powinno zajmować 40 bajtów

Wyspecjalizuj ten szablon dla typu bool, tak aby elementy tego typu zajmowały w pamięci 1 bit, a nie 1 bajt.

Rozwiązanie

Wykład zawiera dyskusję problemów związanych z porównywaniem elementów wewnątrz algorytmów uogólnionych. Porównywanie za pomocą operatora < nie zawsze jest tym, czego potrzebujemy - klasycznym przykładem są łańcuchy char *. Są również sytuacje gdy np. chcemy posortować ciąg liczb według ich odległości od pewnej wyznaczonej wartości.

Pojemniki i algorytmy STL zapewniają możliwość wyspecyfikowania pożądanego sposobu sortowania poprzez dodatkowy parametr szablonów. Tym parametrem jest funktor, biorący jako argumenty dwie wartości danego typu i zwracający odpowiedź na pytanie "czy pierwszy argument jest mniejszy od drugiego?" jako wartość boolowską. Jako domyślną wartość tego parametru przyjmuje się std::less<>, czyli zwykłe porównywanie poprzez < .

Ćwiczenie 4

Zapoznaj się z rodziną funktorów porównujących, do której należy std::less<>. Przypomnij sobie pojemnik std::set. Następnie napisz programik korzystający ze zbioru liczb posortowanego odwrotnie (czyli malejąco).

Rozwiązanie

Ćwiczenie 5

Zaimplementuj uogólniony algorytm sortujący przez prosty wybór ciąg elementów wyznaczony dwoma iteratorami. Do zamiany miejscami dwóch elementów użyj std::swap, a porównania wykonuj przy pomocy funktora przekazywanego jako parametr szablonu naszego algorytmu. Pamiętaj, że jako parametr dostaniesz klasę funktora; aby móc porównywać, musisz stworzyć obiekt tej klasy. Funktory zazwyczaj mają puste konstruktory i żadnych składowych, więc koszt stworzenia takiego obiektu jest pomijalny.

Uwaga

STL udostępnia uogólniony algorytm sortujący o nazwie std::sort. Zwróć uwagę na inny sposób przekazywania funktora porównującego elementy - nie przez nazwę klasy będącą parametrem szablonu, lecz przez instancję tej klasy przekazaną jako argument funkcji. Rozwiązanie przyjęte w STL jest lepsze, gdy mamy do czynienia z funktorami posiadającymi wewnętrzny stan; przed rozpoczęciem sortowania można ten stan zainicjować.

Rozwiązanie