Szablony

Szablon funkcji

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

Szablon klasy

template <class Typek>
class Klasa
{
   Typek *x;
   void Metoda();
}

Szablon funkcji składowej (metody)

template <class Typek>
void Klasa<Typek>::Metoda()
{
 
}

Zaimplementuj szablon klasy Wektor, która jest pojemnikiem przechowującym dowolną ilość elementów pewnego typu (typ elementów jest parametrem szablonu klasy). Klasa ta powinna implementować 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ę do konkretnego elementu wektora
  • IleElementow zwraca ilość elementów (nie pojemność wektora)
  • Rozmiar podaje pojemność wektora
  • Dodaj umieszcza element na końcu wektora (jeśli pojemność wektora jest za mała należy ją zwiększyć, np. dwukrotnie).
  • Usun usuwa ostatni element wektora.
  • Wyczysc usuwa wszystkie elementy z wektora
  • destruktor

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;

Zadania dodatkowe
Dodaj do klasy Wektor:

  • konstruktor kopiujący
  • przeciążoną metodę Dodaj pozwalającą dodać element na dowolnej pozycji (od 0 do ile_elemntow).
  • przeciążoną Usun usuwającą element z wybranej pozycji. Metoda powinna zwracać usuwany element.
  • dociąż operator « wypisujący zawartość wektora do strumienia (zakładamy, że dla typu składowego wektora istnieje dociążony odpowiednio operator «)

Dodaj do klasy Wektor:

  • iterator o swobodnym dostępie (random access iterator)
  • metody begin() i end() zwracające iterator (bezpośredniego dostępu) pokazujący odpowiednio na pierwszy element oraz na pozycję za ostatnim elementem.
W tym przypadku iterator swobodnego dostępu będzie po prostu wskaźnikiem typu T*. Wystarczy więc przezwać ten typ używając polecenia typedef.

Przykładowe użycie:

Wektor<int> wektor;
for(int i=0 ; i<100 ; i++) wektor.Dodaj(i);
 
Wektor<int>::iterator it;
for(it=wektor.begin() ; it!=wektor.end() ; it++) cout << *it << endl;