Szablony
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 pojemnikaelementy
- wskaźnik do tablicy o rozmiarzerozmiar
, która przechowuje elementyliczba_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 podanej pojemności - operator
[]
pozwalający odwołać się wskazanego elementu wektora na takiej samej zasadzie jak w przypadku tablic (np.x=wektor[2]
) IleElementow()
zwraca liczbę elementówRozmiar()
zwraca pojemność wektoraDodaj()
umieszcza podany w argumencie element na końcu kolekcji. 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 listy.Usun()
usuwa ostatni element z kolekcjiWyczysc()
usuwa wszystkie elementy z kolekcji- destruktor
- konstruktor kopiujący
- operator przypisania
operator=
- operator
«
wypisujący zawartość wektora do strumienia wyjsciowego (zakładamy, że dla typuT
składowego wektora istnieje dociążony odpowiednio operator«
) - przeciążoną metodę
Dodaj
pozwalającą dodać element na dowolnej pozycji (od 0 doliczba_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:
- funkcja getline() - czytanie linii ze strumienia wejściowego
Zadanie 8: Szablon funkcji
1. Zaimplementuj szablon funkcji o nazwie zamien
służącej do zamiany dwóch wartości 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
.
2. Zaimplementuj funkcję szablonową sortuj()
służącą do sortowania elementów kolekcji Wektor
. Funkcję sortuj()
możesz zrealizować w postaci funkcji składowej szablonu klasy Wektor
lub jako funkcję globalną, która sortuje wektor podany w argumencie. Wywołanie funkcji układa elementy kolekcji 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 kolekcji wykorzystaj funkcję szablonową zamien
z poprzedniego punktu.
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