Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <utility>
- #include <vector>
- #include <memory>
- #include <algorithm>
- using namespace std;
- class Cudo {
- string naziv;
- pair<string, string> lokacija;
- int godina_pronalaska;
- public:
- //2
- Cudo(string ime, pair<string, string> GdjeSeNalazi, int godina) :
- naziv(ime), lokacija(GdjeSeNalazi), godina_pronalaska(godina){}
- //3
- Cudo(string ime, string mjesto, string detaljnijeMjesto, int godina) :
- naziv(ime), godina_pronalaska(godina) {
- lokacija.first = mjesto;
- lokacija.second = detaljnijeMjesto;
- }
- string DajNaziv() const {return naziv;}
- string DajLokaciju(bool prvi_drugi) const {
- if(prvi_drugi)
- {
- return lokacija.first;
- }
- return lokacija.second;
- }
- int DajGodinu() const {return godina_pronalaska;}
- };
- class SvjetskaCuda {
- vector<shared_ptr<Cudo>> cuda;
- public:
- //1
- SvjetskaCuda(){}
- //7
- SvjetskaCuda(const SvjetskaCuda &poslano)
- {
- this->cuda.resize(poslano.cuda.size());
- for(int i=0;i<this->cuda.size();i++)
- {
- this->cuda[i] = make_shared<Cudo>(*poslano.cuda[i]);
- }
- }
- // Ovo bi se trebalo preko swapa implementirati
- // Nisam siguran zasto ne moze, ali izbacuje mi error kada pokusam
- //8
- SvjetskaCuda(SvjetskaCuda &&poslano)
- {
- this->cuda.resize(poslano.cuda.size());
- for(int i=0;i<this->cuda.size();i++)
- {
- this->cuda[i] = make_shared<Cudo>(*poslano.cuda[i]);
- poslano.cuda[i] = nullptr;
- }
- }
- //4
- void Dodaj(const string &ime, const pair<string, string> &GdjeSeNalazi, const int &godina)
- {
- cuda.resize(cuda.size()+1);
- cuda[cuda.size() - 1] = make_shared<Cudo>(ime , GdjeSeNalazi, godina);
- }
- //5
- void Dodaj(const Cudo &c)
- {
- cuda.resize(cuda.size() +1);
- cuda[cuda.size() - 1] = make_shared<Cudo>(c);
- }
- //Takodjer 6, ali samo za jednu stvar
- friend SvjetskaCuda &operator +=(SvjetskaCuda &s, const Cudo &c)
- {
- s.cuda.resize(s.cuda.size()+1);
- s.cuda[s.cuda.size() - 1] = make_shared<Cudo>(c);
- return s;
- }
- //6
- void Dodaj(const initializer_list<Cudo> &lista)
- {
- this->cuda.resize(cuda.size() + lista.size());
- auto it(lista.begin());
- for(int i = this->cuda.size() - lista.size();i<this->cuda.size();i++)
- {
- this->cuda[i] = make_shared<Cudo>(*it);
- it++;
- }
- }
- //9
- friend bool operator ==(const SvjetskaCuda &s1, const SvjetskaCuda &s2)
- {
- if(s1.cuda.size() != s2.cuda.size())
- {
- return 0;
- }
- for(int i=0;i<s1.cuda.size();i++)
- {
- if(s1.cuda[i]->DajNaziv() != s2.cuda[i]->DajNaziv() || s1.cuda[i]->DajGodinu() != s2.cuda[i]->DajGodinu()
- || s1.cuda[i]->DajLokaciju(1) != s2.cuda[i]->DajLokaciju(1) || s1.cuda[i]->DajLokaciju(0) != s2.cuda[i]->DajLokaciju(0))
- {
- return 0;
- }
- }
- return 1;
- }
- //10
- friend SvjetskaCuda &operator -=(SvjetskaCuda &sv, const string &s)
- {
- for(auto i=0;i < sv.cuda.size();i++)
- {
- if(sv.cuda[i]->DajNaziv() == s)
- {
- sv.cuda.erase(sv.cuda.begin() + i);
- }
- }
- return sv;
- }
- //11
- SvjetskaCuda &operator =(const SvjetskaCuda &sv1)
- {
- this->cuda.resize(sv1.cuda.size());
- for(int i=0; i < this->cuda.size();i++)
- {
- this->cuda[i] = make_shared<Cudo>(*sv1.cuda[i]);
- }
- return *this;
- }
- // 12
- // Mescini ovo ne valja, posto salje nesto sto prestaje postojati
- // A posto su pametni pokazivaci, automatski se izbrise kada prestane postojati
- friend SvjetskaCuda &operator /(const SvjetskaCuda &sv, string s)
- {
- SvjetskaCuda vraca;
- for(int i=0;i<sv.cuda.size();i++)
- {
- if(sv.cuda[i]->DajLokaciju(1) == s)
- {
- vraca.cuda.resize(vraca.cuda.size() + 1);
- vraca.cuda[vraca.cuda.size() - 1] = make_shared<Cudo>(*sv.cuda[i]);
- }
- }
- return vraca;
- }
- // Ovo pojma nemam, kako da napravim operator koji se ponasa kao pokazivac
- //13
- int operator *(const SvjetskaCuda &sv)
- {
- return sv.cuda.size();
- }
- int operator [](string s)
- {
- for(auto i=0;i < this->cuda.size();i++)
- {
- if(this->cuda[i]->DajNaziv() == s)
- {
- return this->cuda[i]->DajGodinu();
- }
- }
- return 0;
- }
- // Ostalo jos ovo da promijeni godinu ali ne da mi se vise
- };
- int main()
- {
- SvjetskaCuda unesco; // (1) - Oprez, ovo mora da radi i kad se implementira (7)
- Cudo c1("Mehina kafana", {"BiH", "Sarajevo, Sedrenik"}, 2016); // (2)
- Cudo c2("Ibrin golf dvojka", "Srbija", "Novi Pazar", 1843); // (3) - druga sintaksa
- unesco.Dodaj("Piramide", {"BiH", "Visoko"}, 2005); // (4)
- unesco.Dodaj(c1); // (5);
- unesco += c2; // (6) - alternativna sintaksa za (5)
- unesco.Dodaj({{"Viseći vrtovi", {"Irak", "Babilon"}, -600},
- {"Keopsova piramida", {"Egipat", "Giza"}, -2550},
- {"Ajfelov toranj", {"Francuska", "Pariz"}, 1889}}); // (6) - dodaje više odjednom
- SvjetskaCuda kopija(unesco); // (7) - duboka kopija
- SvjetskaCuda kopija2(std::move(kopija)); // (8)
- if(kopija2 == unesco) std::cout << "Fakat su identicni!\n"; // (9)
- unesco -= "Mehina kafana"; // (10) - briše čudo iz kolekcije
- kopija = kopija2; // (11)
- // SvjetskaCuda bosanska_cuda;
- // // bosanska_cuda = unesco / "BiH"; // (12) - izdvaja čuda koja su u BiH
- // //std::cout << "Broj bosanskih čuda: " << *bosanska_cuda << std::cout; // (13)
- std::cout << unesco["Ajfelov toranj"] << std::endl; // (14) - daje godinu izgradnje
- // //unesco["Piramide"] = -10000; // (15) - mijenja godinu izgradnje
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement