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.

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 pojemnika
  • elementy - wskaźnik do tablicy o rozmiarze rozmiar, która przechowuje elementy
  • liczba_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 IleElementow zwraca liczbę elementów
  • funkcja Rozmiar zwraca 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 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 wyjściowego std::ostream (zakładamy, że dla typu T składowego wektora istnieje przeciążony operator <<)
  • przeciążona metoda Dodaj pozwalająca dodać element na dowolnej pozycji (od 0 do liczba_elementow)
  • przeciążona metoda Usun usuwają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:

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