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

template <typename TipElemenata>
class Vektor {
    TipElemenata *elementi;
    int velicina;

public:
    Vektor(int velicina = 0, TipElemenata inicijalno = TipElemenata()) : 
    elementi(new TipElemenata[velicina]), velicina(velicina){
        for(int i = 0; i < velicina; i++){
            elementi[i] = inicijalno;
        }
    }
    ~Vektor(){

        delete [] elementi;
    };

    Vektor(const Vektor &v) : elementi(new TipElemenata[v.velicina]), velicina(v.velicina){

        for(int i = 0; i < velicina; i++)
            elementi[i] = v.elementi[i];
    }

    Vektor(Vektor &&v) : elementi(v.elementi), velicina(v.velicina){

        v.elementi = nullptr;
        v.velicina = 0;
    }

    Vektor &operator =(Vektor v){
        std::swap(elementi, v.elementi);
        std::swap(velicina, v.velicina);

        return *this;
        
    }

    Vektor(std::initializer_list<TipElemenata> l) : 
                    elementi(new TipElemenata[l.size()]), velicina(int(l.size())){
        int i = 0;
        for(auto x : l){

            elementi[i] = x;
            i++;
        }
            
     }

    int DajVelicinu() const { return velicina;}

    void PromijeniVelicinu(int nova_velicina, TipElemenata popuna = TipElemenata()){
        if(nova_velicina < 0) throw std::domain_error("Neispravna velicina");
        if(velicina == nova_velicina) return;
        if(nova_velicina >= velicina * 0.8 && nova_velicina < velicina) 
            {velicina = nova_velicina; return;} 
        TipElemenata *novi = new TipElemenata[nova_velicina];
        if(nova_velicina > velicina){
            for(int i = 0; i < velicina; i++) novi[i] = elementi[i];
            for(int i = velicina; i < nova_velicina; i++)novi[i] = popuna;                 
        }
        else{
            for(int i = 0; i < nova_velicina; i++) novi[i] = elementi[i];
        }

        auto pomocni = elementi;
        elementi = novi;
        velicina = nova_velicina;
        delete [] pomocni;
        
    }
    void DodajNaKraj(const TipElemenata &e){
        PromijeniVelicinu(velicina + 1, e);
    }

    TipElemenata operator[](int i) const{
        if(i < 0 || i >= velicina) throw std::range_error("Nedozvoljen indeks");

        return elementi[i];
    }
    TipElemenata &operator[](int i){
        if(i < 0 || i >= velicina) throw std::range_error("Nedozvoljen indeks");
        return elementi[i];
    }

    TipElemenata *begin() const{ return elementi;}
    TipElemenata *end() const { return elementi + velicina;}
};

int main() {
    Vektor<int> v(5, 3);

    std::cout << "Pocetni vektor: ";
    for(auto x : v) std::cout << x << " ";
    std::cout << "\nVelicina: " << v.DajVelicinu() << std::endl;

    v[2] = 10;

    std::cout << "Nakon v[2] = 10: ";
    for(auto x : v) std::cout << x << " ";
    std::cout << std::endl;

    v.DodajNaKraj(99);

    std::cout << "Nakon DodajNaKraj(99): ";
    for(auto x : v) std::cout << x << " ";
    std::cout << "\nVelicina: " << v.DajVelicinu() << std::endl;

    v.PromijeniVelicinu(8, 7);

    std::cout << "Nakon povecanja na 8, popuna 7: ";
    for(auto x : v) std::cout << x << " ";
    std::cout << "\nVelicina: " << v.DajVelicinu() << std::endl;

    v.PromijeniVelicinu(6);

    std::cout << "Nakon smanjenja na 6: ";
    for(auto x : v) std::cout << x << " ";
    std::cout << "\nVelicina: " << v.DajVelicinu() << std::endl;

    Vektor<int> v2{1, 2, 3, 4};

    std::cout << "Vektor iz initializer_list: ";
    for(auto x : v2) std::cout << x << " ";
    std::cout << std::endl;

    Vektor<int> v3(v2);

    std::cout << "Kopirani vektor v3: ";
    for(auto x : v3) std::cout << x << " ";
    std::cout << std::endl;

    Vektor<int> v4(std::move(v3));

    std::cout << "Pomjereni vektor v4: ";
    for(auto x : v4) std::cout << x << " ";
    std::cout << "\nVelicina v3 nakon move: " << v3.DajVelicinu() << std::endl;

    Vektor<int> v5;
    v5 = v4;

    std::cout << "Vektor v5 nakon dodjele v5 = v4: ";
    for(auto x : v5) std::cout << x << " ";
    std::cout << std::endl;

    try {
        std::cout << v5[100] << std::endl;
    } catch(std::range_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: