#include <iostream>
#include <initializer_list>
#include <utility>
#include <stdexcept>

template <typename T>
class Dek{

    T **elementi;
    int kapacitet;
    int i1, i2;
    void Realociraj();
    void Unisti();

    public:

    Dek() : elementi(new T *[10]), kapacitet(10), i1(5), i2(5){}
    Dek(std::initializer_list<T> l) : Dek(){
        for(auto x : l) DodajNaKraj(x);
    }
    ~Dek() {Unisti();}

    int DajVelicinu() const { return i2 - i1;}
    
    void DodajNaKraj(const T &x){
        if(i2 == kapacitet) Realociraj();
        elementi[i2] = new T (x);
        i2++;
        
        
    }
    void DodajNaPocetak(const T &x){
        if(i1 == 0) Realociraj();
        i1--;
        elementi [i1] = new T (x);
       

    }

    Dek(const Dek &d) 
    : elementi(new T* [d.kapacitet]), kapacitet(d.kapacitet), i1(d.i1), i2(d.i2){

        for(int i = i1; i < i2; i++){
            elementi[i] = new T (*d.elementi[i]);
        }

        
        
    }
    Dek(Dek &&d) : elementi(d.elementi), kapacitet(d.kapacitet), i1(d.i1), i2(d.i2){

        d.elementi = nullptr;
        d.kapacitet = d.i1 = d.i2 = 0;
        
    }

    Dek &operator=(Dek d){

        std::swap(elementi, d.elementi);
        std::swap(kapacitet, d.kapacitet);
        std::swap(i1, d.i1);
        std::swap(i2, d.i2);
        
        return *this;
        
    }

    const T &operator[] (int i) const{
        if(i < 0 || i >= DajVelicinu()) throw std::logic_error("Nedozvoljen index");
        return *(elementi[i1 + i]);
    }
     T &operator[] (int i) {
        if(i < 0 || i >= DajVelicinu()) throw std::logic_error("Nedozvoljen index");
        return *(elementi[i1 + i]);
    }
    
    
    
    
    
};

template<typename T>
void Dek<T>::Realociraj(){
    int novi_kapacitet = int (kapacitet * 1.5);
    T** novi = new T*[novi_kapacitet];

    int n1, n2;
    n1 = n2 = novi_kapacitet / 3;

    for(int i = i1; i < i2; i++){
        novi[n2] = elementi[i];
        n2++;
    }
    delete [] elementi;
    
    elementi = novi;
    i1 = n1;
    i2 = n2;
    kapacitet = novi_kapacitet;

    
}
template<typename T>
void Dek<T>::Unisti(){

    for(int i = i1; i < i2; i++) delete elementi[i];

    delete [] elementi;
}

int main() {
    Dek<int> d{3, 4, 5};

    std::cout << "Pocetni dek: ";
    for(int i = 0; i < d.DajVelicinu(); i++)
        std::cout << d[i] << " ";
    std::cout << std::endl;

    d.DodajNaPocetak(2);
    d.DodajNaPocetak(1);
    d.DodajNaKraj(6);
    d.DodajNaKraj(7);

    std::cout << "Nakon dodavanja na pocetak i kraj: ";
    for(int i = 0; i < d.DajVelicinu(); i++)
        std::cout << d[i] << " ";
    std::cout << std::endl;

    d[0] = 100;
    d[d.DajVelicinu() - 1] = 700;

    std::cout << "Nakon izmjene preko []: ";
    for(int i = 0; i < d.DajVelicinu(); i++)
        std::cout << d[i] << " ";
    std::cout << std::endl;

    Dek<int> kopija(d);

    std::cout << "Kopija: ";
    for(int i = 0; i < kopija.DajVelicinu(); i++)
        std::cout << kopija[i] << " ";
    std::cout << std::endl;

    Dek<int> pomjereni(std::move(kopija));

    std::cout << "Pomjereni: ";
    for(int i = 0; i < pomjereni.DajVelicinu(); i++)
        std::cout << pomjereni[i] << " ";
    std::cout << std::endl;

    std::cout << "Velicina kopije nakon move: " << kopija.DajVelicinu() << std::endl;

    Dek<int> dodjela;
    dodjela = pomjereni;

    std::cout << "Dodjela: ";
    for(int i = 0; i < dodjela.DajVelicinu(); i++)
        std::cout << dodjela[i] << " ";
    std::cout << std::endl;

    try {
        std::cout << dodjela[100] << std::endl;
    } catch(std::logic_error &e) {
        std::cout << "Uhvatili smo izuzetak: " << e.what() << std::endl;
    }

    return 0;
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: