Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <new>
- using namespace std;
- //pravim matricu koristeci fragmentirani postupak alokacije
- template<typename tip>
- tip **Fragmentirana(tip broj_redova, tip broj_kolona)
- {
- tip **p = new tip*[broj_redova]; //pokazivac na niz pokazivaca
- for(int i = 0; i < broj_redova; i++)
- p[i] = nullptr;
- try
- {
- for(int i = 0; i < broj_redova; i++)
- {
- p[i] = new tip[broj_kolona]; //svakom pokazivacu unutar niza dodjeljujem niz na koji ce pokazivati, to su kolone
- }
- }
- catch(bad_alloc)
- {
- for(int i = 0; i < broj_redova; i++) //ako alokacija ne uspije, obrisi sta si dosad zauzeo (kolone)
- delete[] p[i];
- delete[] p; //obrisi i niz pokazivaca
- throw bad_alloc(); //baci izuzetak
- }
- return p;
- }
- template<typename tip>
- tip **Kontinualna(tip **matrica, tip broj_redova, tip broj_kolona)
- {
- tip **q = new tip*[broj_redova]; //alociraj jedan veliki blok memorije, jedan niz velicine "broj redova"
- try
- {
- q[0] = new tip[broj_kolona*broj_kolona]; //kao prvi element stavi jedan ogroman niz koji ces kasnije parcati na manje nizove
- }
- catch(bad_alloc)
- {
- delete[] q; //ako ne uspije, sve sto smo dosad zauzeli je samo ovaj veliki niz, pa njega samo treba i obrisati
- throw bad_alloc(); //baci izuzetak
- }
- for(int i = 1; i < broj_redova; i++)
- {
- q[i] = q[i-1] + broj_kolona; //ovim parcam onaj ogromni niz na manje podnizove velicine broja kolona, sve kolone su u kontinualnom poretku
- }
- for(int i = 0; i < broj_redova; i++) //prepisujem iz pocetne u novokreiranu
- {
- for(int j = 0; j < broj_kolona; j++)
- {
- q[i][j] = matrica[i][j];
- }
- }
- for(int i = 0; i < broj_redova; i++) //brisem pocetnu, posto je fragmentirano alocirana, brisem kolone, pa niz pokazivaca
- delete[] matrica[i];
- delete[] matrica;
- matrica = q;
- return matrica;
- }
- int main()
- {
- cout << "Unesite broj redova matrice: ";
- int broj_redova;
- cin >> broj_redova;
- cout << "Unesite broj kolona matrice: ";
- int broj_kolona;
- cin >> broj_kolona;
- vector<vector<int>> matrica{{1,2,3}, {2,3,4}, {4,5,6}}; //ovo mi je da ne unosim sa tastature
- try
- {
- int** p = Fragmentirana(broj_redova, broj_kolona);
- for(int i = 0; i < broj_redova; i++) //prepisujem ovo iz vector<vector<int>> u dinamicki (fragmentirano) alociranu
- for(int j = 0; j < broj_kolona; j++)
- p[i][j] = matrica[i][j];
- int **q = Kontinualna(p, broj_redova, broj_kolona); //posto sam p vec gore obrisao, ne moram opet
- for(int i = 0; i < broj_redova; i++)
- {
- for(int j = 0; j < broj_kolona; j++)
- cout << q[i][j] << " ";
- cout << endl;
- }
- delete[] q; //brisem samo onaj velikacki niz
- }
- catch(bad_alloc)
- {
- cout << "Alokacija kontinualne nije uspjela";
- }
- catch(bad_alloc)
- {
- cout << "Alokacija fragmentirane nije uspjela";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement