Kliknite tukaj, da si ogledate profil, kot ga vidijo drugi

Sortiranje podatkov

Delite vsebino na Facebooku
Delite vsebino na Twitterju
  V lekciji bomo uporabili funkcijo std::sort iz knjižnice algorithm, s pomočjo katere bomo sortirali polje elementov v naraščajočem vrstnem redu.
 
 
1
 
 

Funkcija std::sort se nahaja v knjižnici algorithm. Z njeno pomočjo lahko sortiramo polje elementov v naraščajočem vrstnem redu ali pa napišemo svojo funkcijo in določimo svoja pravila sortiranja za kompleksne tipe.

 
Za vključitev te funkcije potrebujemo knjižnico oz ukaz
#include <algorithm>

Funkcija je prav tako v imenskem prostoru (namespace) std::

Zato njena sintaksa v kodi lahko zgleda nekako tako:

std::sort(&I[0],&I[9]);

std::sort(C,C+7);

std::sort(&P[0],&P[3],PREDMET_SORT);


std:: seveda ni potreben, če smo ga že najavili
(using namespace std) 


Spremenljivke I,C in P so polja različnih tipov in kot ste opazili, se vsaka vrstica razlikuje v sintaksi.

V bistvu pa sta prvi dve identični, le tretja je drugačna, saj sprejme funkcijo (kazalec na njo) kot 3. parameter.


Funkcija sort potrebuje kot prvi parameter pomnilniško lokacijo 1. elementa v polju, kot drugi parameter pa pomnilniško lokacijo zadnjega elementa v polju.

Tukaj igra vlogo referenčni operator &, kateri vrne pomnilniško lokacijo:

&I[0] //vrne pomnilniško lokacijo 1. elementa v polju I 


Če pa imamo malce poglobljeno znanje o C-ju, pa vemo, da lahko polja predstavimo s kazalci.

*(I+9) //vrne vrednost na 9 mestu v polju I
(I+9) // vrne pomnilniško lokacijo na 9 mestu v polju I

Razliko naredi dereferenčni operator *, kateri iz pomnilniške lokacije pridobi vrednost.


Tako lahko preprosto dobimo lokacijo prvega in zadnjega elementa v polju na sledeč način:

std::sort(I,I+velikost_polja);  //I+0 je enako I, zato kar pišemo I


Ko se funkcija zaključi so elementi sortirani po naraščajočem vrstnem redu.

 
 
2
 
 

Pogljemo si še kompleksnejši primer:

std::sort(&P[0],&P[3],PREDMET_SORT);

Iz prejšnega koraka nam je znano, kaj delata prva dva parametra. Kako pa se koristiti tretjega?

Ta parameter sicer ni obvezen, ampak ob ustvarjanju lastnih razredov oziorma struktur to postane.



Primer:

struct PREDMET{

string naziv;

double cena;

PREDMET():cena(0){}

PREDMET(string naziv,double cena):naziv(naziv),cena(cena){}

};


bool PREDMET_SORT(PREDMET p1, PREDMET p2)

{
    return p1.cena<p2.cena;
}

 

void PRINT(PREDMET tip[],short size)

{

for(int i=0;i<size;i++)

cout<<"|"<<tip[i].naziv<<" "<<tip[i].cena<<"|"<< " ";

cout<<endl;

}


int main()
{
PREDMET P[] =  {
 PREDMET("Zapestnica",3.5),
 PREDMET("Ura",50.99),
 PREDMET("Pisalo",7)
}; // 3 elementi

 std::sort(&P[0],&P[3],PREDMET_SORT);
 PRINT(P,3);
 cin.get();
 return 0;
}


Problem nastane, ko bomo želeli sortirati naš razred PREDMET, saj vsebuje 2 podatkovna tipa: int in string, in se ne ve, po čem mora sortirati objekte.

Tako moramo napisati funckijo, ki vrača bool in sprejme kot dva vhodna parametra tip razreda katerega bomo sortirali.

Funkciji pa moramo povedati kateri podatek mora primerjati:

return p1.cena<p2.cena;

V našem primeru bo sortirala naraščajoče, saj povemo, da če je cena n-tega elementa manjša od cene n+1-tega elementa (naslednjega), naj vrne true.


 
 
3
 
 

Vprašanja so dobrodošla.

Spodaj pa se nahaja še primer celotne kode:

#include < iostream >

#include < string >

#include < algorithm >

using namespace std;

 

struct PREDMET{

string naziv;

double cena;

PREDMET():cena(0){}

PREDMET(string naziv,double cena):naziv(naziv),cena(cena){}

};

 

template< typename T >

void PRINT(T tip[],short size)

{

for(int i=0;i<size;i++)

cout<<tip[i]<< " ";

cout<<endl;

}

/*
TEMPLATE (ŠABLON) se bomo lotili v naslednjem vodiču.
Na kratko: Šablone nam omogočajo, da napišemo samo 1x funkcijo, katera bo delovala za različne TIPE!
Torej T je lahko int, char, string, double...
*/

 

void PRINT(PREDMET tip[],short size)

{

for(int i=0;i<size;i++)

cout<<"|"<<tip[i].naziv<<" "<<tip[i].cena<<"|"<< " ";

cout<<endl;

}

 

bool PREDMET_SORT(PREDMET p1, PREDMET p2)

{

return p1.cena<p2.cena;

}

 

int main()

{

int I[] ={9,1,8,2,7,3,6,4,5}; //9 elementov

char C[] = {'e','s','a','b','d','c','v'}; // 7 elementov

string S[] = {"abcd","bcde","bade","baaa","abc"}; // 5 elementov

PREDMET P[] = {PREDMET("Zapestnica",3.5),PREDMET("Ura",50.99),PREDMET("Pisalo",7)}; // 3 elementi

 

sort(&I[0],&I[9]);

sort(C,(C+7));

sort(&S[0],&S[5]);

sort(&P[0],&P[3],PREDMET_SORT);

 

PRINT(I,9);

PRINT(C,7);

PRINT(S,5);

PRINT(P,3);

 

cin.get();

return 0;

}

 
 
Komentiraj
 
 
Prijava in registracija
 
 
 
Zmaga.com ponuja brezplačno in razumljivo učenje računalniških programov, vas na enkraten način spozna z različnimi svetovnimi jeziki, s podrobno obrazloženimi recepti prikaže čare kulinarike in vam prežene strahove pred domačimi opravili.
 
 
Poleg tega lahko prebirate poučne članke, ki so namenjene širjenju naše splošne razgledanosti ter preverite svoje znanje z priljubljenim in enostavnim sistemom za preverjanje znanja. Če med vsebinami, ki se dodajajo vsak dan, ne najdete želenega znanja, je za vaša vprašanja na voljo dobro obiskan forum, kjer lahko tudi aktivno sodelujete. V primeru, da bi radi svoje praktično znanje delili z ostalimi, pa to lahko storite preko preprostega vmesnika za dodajanje vsebin. Zmagajte z znanjem z Zmaga.com!