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.
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 rozmiarze rozmiar, która przechowuje elementy liczba_elementow - aktualna liczba elementów w pojemnikuKlasa udostępnia następujące metody:
Wektor(int rozmiar) inicjuje wektor o podanym rozmiarze[] pozwalający odwołać się do elementu wektora o wskazanym indeksie na takiej samej zasadzie, jak w przypadku tablic (np. x = wektor[2])IleElementow zwraca liczbę elementówRozmiar zwraca rozmiar wektoraDodaj(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.Usun usuwa ostatni element z kolekcjiWyczysc usuwa wszystkie elementy z kolekcjioperator =« wypisujący zawartość wektora do strumienia wyjściowego std::ostream (zakładamy, że dla typu T składowego wektora istnieje przeciążony operator <<)Dodaj pozwalająca dodać element na dowolnej pozycji (od 0 do liczba_elementow)Usun usuwająca element z podanej w argumencie pozycjiPrzykł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.
Przydatne funkcje:
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:
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