Pri tej nalogi boste narediti šablono razreda, in sicer za redke matrike(https://en.wikipedia.org/wiki/Sparse_matrix) (SparseMatrix2D) za poljuben tip. Gre za matriko, ki ima večino elementov enakih 0 in malo elementov, ki so različni od 0. Te matrike so lahko kar velike in posledično predstavljajo problem za shranjevanje, saj nas večina pozicij ne zanima, ker imajo splošno vrednost 0. To težavo lahko rešimo na način, da beležimo le vrednosti, ki so različne od 0, in njihovo lokacijo (x in y koordinato). To bomo rešili z dodatno šablono razreda Element.

Implementacijo šablono razredov napišite vse v posamezno datoteko .h (brez .cpp).

Napišite šablono razreda Element, ki naj ima:
    instančne spremenljivke:
        x in y (tipa unsigned int)
        value, ki je lahko poljubnega tipa
    konstruktor s 3 paremetri,
    set in get metode.
Napišite šablono razreda SparseMatrix2D, ki naj ima:
    instančne spremenljivke:
        elements (tipa std::vector<Element<T>>),
        sizeX in sizeY, ki predstavljata velikost matrike (tipa unsigned int)
        defaultElement, ki predstavlja privzeto vrednost matrike in je poljubljena tipa.
    konstruktor s 3 parametri (sizeX,sizeY, defaultElement),
    metodo set(unsgined int x, unsigned int y, T value), ki doda element v primeru, da na teh koordinatah element še ne obstaja. V primeru, da že obstaja pa obstoječ element posodobi z novo vrednostjo.
    metodo at(unsigned int x, unsgined int y), ki vrne element na podanih koordinatah. V primeru, da na tisti lokaciji ni elementa, vrnemo privzeto vrednost matrike.
    metodo getSizeX in getSizeY, ki vračata posamezno dimenzijo matrike
V programu main ustvarite vsaj 2 redki matriki (ena je lahko splošnega tipa in ena, kjer je tip objekt - ni dovoljena uporaba razreda Point) in ju izrišite kot je prikazano v spodnjem primeru.

int main() { // example for Point Point p(9, 9); Element e(1, 1, p); cout << e.getValue().toString() << endl; SparseMatrix2D bigPointMatrix(10, 10, Point(0, 0)); bigPointMatrix.set(5, 5, p);

// example for int
SparseMatrix2D bigIntMatrix(10, 10, 0);
bigIntMatrix.set(5, 5, 8);
bigIntMatrix.set(2, 3, 7);
bigIntMatrix.set(2, 2, 4);

for (int i = 0; i < bigIntMatrix.getSizeX(); i++) {
    for (int j = 0; j < bigIntMatrix.getSizeY(); j++) {
        cout << bigIntMatrix.at(i,j) << (j != bigIntMatrix.getSizeY() - 1 ? " ; " : "");
    }
    cout << endl;
}

return 0;

}

Primer izpisa:

0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 0 ; 0 ; 4 ; 7 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 0 ; 0 ; 0 ; 0 ; 0 ; 8 ; 0 ; 0 ; 0 ; 0 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0