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.

Szablony klas umożliwiają tworzenie klas, które mogą działać z różnymi typami danych.

Szablon funkcji

template <typename Typek> Typek pewna_funkcja(Typek x) { return x; }

Szablon klasy

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>();

Ćwiczenie: szablon klasy Wektor

Zaimplementuj szablon klasy Wektor, która jest pojemnikiem przechowującym kolekcję elementów pewnego typu (typ elementów jest parametrem szablonu klasy). Wektor udostępnia elementy kolekcji w identyczny sposób jak tablica ale jest strukturą dynamiczną, która zwiększa automatycznie swój rozmiar w miarę dodawania nowych elementów.

Klasa Wektor składa się z następujących pól:

rozmiar - rozmiar pojemnika

elementy - wskaźnik do tablicy o rozmiarze rozmiar, która przechowuje elementy

liczba_elementow - aktualna ilość 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 wskazanego elementu wektora na takiej samej zasadzie jak to jest w przypadku tablic (np. x=wektor[2])

funkcja IleElementow zwraca liczbę elementów

funkcja Rozmiar zwraca pojemność wektora

funkcja Dodaj umieszcza na końcu kolekcji element podany w argumencie . Jeżeli pojemność wektora jest wyczerpana (liczba elementów jest równa rozmiarowi) to przed dodaniem kolejnego elementu rozmiar wektora jest automatycznie zwiekszany dwukrotnie i dopiero wtedy umieszczany jest nowy element na końcu sekwencji elementów.

funkcja Usun usuwa ostatni element z kolekcji

funkcja Wyczysc usuwa wszystkie elementy z kolekcji

destruktor

konstruktor kopiujący

operator przypisania operator=

operator << wypisujący zawartość wektora do strumienia wyjsciowego std::ostream (zakładamy, że dla typu T składowego wektora istnieje dociążony odpowiednio operator <<)

przeciążoną metodę Dodaj pozwalającą dodać element na dowolnej pozycji (od 0 do liczba_elemntow)

przeciążoną metodę Usun usuwającą 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(w*i); } cout << "Wyswietlam pewien wielomian : " << wektor_wielomianow[5] << endl;

Napisz program, który wykorzysta klasę Wektor do przechowywania linii tekstu wczytanych z pewnego pliku tekstowego. Na początku działania program prosi o podanie nazwy pliku, następnie program wczytuje kolejne linie tekstu z podanego pliku i umieszcza je w wektorze. Po przeczytaniu całej zawartości pliku program wypisuje na konsoli elementy wektora w odwrotnej kolejności, tj. program wypisuje zawartość pliku z odwróconą kolejnoscia linii.

Przydatne funkcje:

Input/output with files

funkcja getline() - czytanie linii ze strumienia wejściowego

Zadanie 8: Szablon funkcji

1. Zaimplementuj szablon funkcji o nazwie zamien. Funkcja posiada dwa argumenty tego samego typu i służącej do zamiany wartości obiektów podanych w argumentach. Przykładowo, dla dwóch obiektów a i b wywołanie funkcji

zamien(a, b)

spowoduje, że obiekt a przyjmie wartość obiektu b, a obiekt b przyjmie wartość obiektu a. Funkcja nie zwraca żadnej wartości.

2. Zaimplementuj szablon funkcji sortuj() służący do sortowania elementów kolekcji Wektor. Funkcję sortującą możesz zrealizować w postaci metody szablonu klasy Wektor lub jako funkcję globalną. Wywołanie funkcji układa elementy wektora w porządku od najmniejszego do największego. Zakładamy, że obiekty znajdujące się w wektorze posiadają zdefiniowany operator mniejszości < pozwalający je porównać. Spróbuj samodzielnie wymyślić algorytm sortowania. Do zamiany położenia elementów wektora wykorzystaj funkcję szablonową zamien z pierwszego punktu zadania.

Napisz program, który wykorzysta klasę Wektor oraz szablon funkcji sortuj() do posortowania liczb zawartych w pliku tekstowym. Nazwę (ścieżkę) pliku podaje użytkownik na początku działania programu. Program czyta liczby z pliku i umieszcza je w wektorze. Po wczytaniu wszystkich liczb kolekcja podlega sortowaniu a wynik wypisany jest na ekranie. Zakładamy, że plik wejściowy zawiera ciąg liczb rzeczywistych odseparowanych białymi znakami.

Przykładowy plik z danymi wejsciowymi: liczby.txt

Jeśli masz problem z wymyśleniem działającego algorytmu sortowania to 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