Szablony
- Szablony funkcji pozwalają na tworzenie funkcji, które mogą działać z różnymi typami danych bez konieczności definiowania każdej wersji osobno. Konkretna wersja funkcji jest generowana przez kompilator w momencie wywołania funkcji z określonym typem argumentów.
- Szablony klas umożliwiają tworzenie klas, które mogą działać z różnymi typami danych.
Szablon funkcji - deklaracja
template <typename Typek> Typek pewna_funkcja(Typek x) { return x; }
Szablon klasy - deklaracja
template <typename Typek> class Klasa { Typek *x; Typek& Metoda(); };
Szablon funkcji składowej (metody)
template <typename Typek> Typek& Klasa<Typek>::Metoda() { }
Przykład użycia
int a = 5; a = pewna_funkcja(a); Wielomian w; Wielomian w2 = pewna_funkcja(w); Klasa<int> obiekt; Klasa<int> *wsk = new Klasa<int>();
Ważne: kompilator generuje szablon dopiero w momencie jego użycia (dla konkretnego typu). Dlatego kod szablonu musi być dostępny dla kompilatora – zwyczajowo implementacja znajduje się w plikach nagłówkowych *.h.
Ćwiczenie: szablon klasy Wektor
Zaimplementuj szablon klasy Wektor – pojemnik przechowujący dynamiczną kolekcję elementów pewnego typu. Typ elementów jest parametrem szablonu klasy. Wektor udostępnia dostęp do elementów identycznie jak tablica, ale automatycznie zwiększa rozmiar w miarę dodawania nowych elementów.
Klasa Wektor składa się z następujących pól:
rozmiar- rozmiar pojemnikaelementy- wskaźnik do tablicy o rozmiarzerozmiar, która przechowuje elementyliczba_elementow- aktualna liczba elementów w pojemniku
Klasa udostępnia następujące metody:
- konstruktor domyślny, inicjuje Wektor o pojemności 20 elementów.
- konstruktor
Wektor(int rozmiar)inicjuje wektor o podanym rozmiarze - operator
[]pozwalający odwołać się do elementu wektora o wskazanym indeksie na takiej samej zasadzie, jak w przypadku tablic (np.x = wektor[2]) - funkcja
IleElementowzwraca liczbę elementów - funkcja
Rozmiarzwraca rozmiar wektora - funkcja
Dodaj(const T &element)umieszcza element na końcu kolekcji. Jeśli wyczerpana jest pojemność wektora (liczba elementów równa rozmiarowi), rozmiar jest automatycznie zwiększany dwukrotnie, a następnie dodawany jest nowy element. - funkcja
Usunusuwa ostatni element z kolekcji - funkcja
Wyczyscusuwa wszystkie elementy z kolekcji - destruktor
- konstruktor kopiujący
- operator przypisania
operator = - operator
«wypisujący zawartość wektora do strumienia wyjściowegostd::ostream(zakładamy, że dla typuTskładowego wektora istnieje przeciążony operator<<) - przeciążona metoda
Dodajpozwalająca dodać element na dowolnej pozycji (od 0 doliczba_elementow) - przeciążona metoda
Usunusuwająca element z podanej w argumencie pozycji
Przykładowy kod testujący klasę:
Wektor<int> liczby; for(int i = 0; i < 100; i++) liczby.Dodaj(i); cout << "Rozmiar " << liczby.Rozmiar() << " elementow " << liczby.IleElementow() << endl; float wsp[] = {1, 2, 3, 4, 5}; Wielomian w1(wsp, 4); Wektor<Wielomian> wektor_wielomianow; for(int i = 0; i < 100; i++) { Wielomian w2 = w1 * liczby[i]; wektor_wielomianow.Dodaj(w2*i); } cout << "Wyświetlam pewien wielomian : " << wektor_wielomianow[5] << endl;
Napisz program, który wykorzysta klasę Wektor do przechowywania linii tekstu wczytanych z pliku.
- Na początku program prosi użytkownika o podanie nazwy pliku.
- Następnie wczytuje kolejne linie z pliku i umieszcza je w wektorze.
- Po wczytaniu całej zawartości wypisuje linie na ekran w odwrotnej kolejności (zawartość pliku od końca).
Przydatne funkcje:
- funkcja getline() - czytanie linii ze strumienia wejściowego
Zadanie 8: Szablon funkcji
1. Zaimplementuj szablon funkcji o nazwie zamien, która zamienia wartości dwóch obiektów tego samego typu. Funkcja nie zwraca żadnej wartości.
Przykładowo wywołanie funkcji
zamien(a, b)
spowoduje, że obiekt a przyjmie wartość obiektu b, a obiekt b przyjmie wartość obiektu a, zaś poniższa instrukcja powinna zamienić elementy tablicy:
zamien(tab[i], tab[j])
2. Zaimplementuj szablon funkcji sortuj() do porządkowania zawartości wektora od najmniejszego do największego. Funkcję można napisać jako metodę klasy Wektor lub funkcję globalną przyjmującą referencję do wektora. Załóż, że elementy posiadają operator mniejszości < do porównywania. W algorytmie sortowania wykorzystaj funkcję zamien do zamiany pozycji elementów.
Napisz program, który wykorzysta klasę Wektor oraz funkcję sortuj() do posortowania liczb z pliku:
- Użytkownik podaje nazwę (ścieżkę) pliku.
- Program wczytuje liczby z pliku do wektora.
- Po wczytaniu wszystkich liczb sortuje je i wypisuje wynik.
- Zakładamy, że plik zawiera liczby rzeczywiste odseparowane białymi znakami.
Przykładowy plik z danymi wejściowymi: liczby.txt
Jeśli masz problem z wymyśleniem działającego algorytmu sortowania, skorzystaj z algorytmu sortowania bąbelkowego
Rozwiązanie w postaci plików nagłówkowych *.h i źródłowych *.cpp umieść w Moodle Zadanie 8