petak, 30. svibnja 2014.

Komparator u C++

Danas ćemo malo razgovarati o komparatorima. Komparatore korisitmo kada želimo uspoređivati određene strukture podataka koje imaju više zasebnih djelova u svojoj strukturi. Znači ako imamo proizvod koji ima cijenu,težinu i datum proizvodnje onda program ne zna kako to treba sortirati. Onda moramo napraviti bool funkciju koja prima 2 argumenta i vraća true ako je prvi manji od drugog. To možemo na najlakši način napraviti pomoću nekoliko if-ova, ali se može pomoću vračanja vrijednosti logičkih vrijednosti. Evo jedan primjer sa sortiranjem koordinata(po x, a onda po y).
struct koord
{
    int x;
    int y;
}
bool cmp(koord A,koord B)
{
    if(A.x==B.x)return A.y<B.y;
    else return A.x<B.x;
}

Ukoliko koordinate imaju isti x koordinate onda ih sortiraj po y koordinati. 
Primjer 2.(želimo sortirati u obrnutom redosljedu int-ove)
bool cmp(int a,int b)
{
  return a>b;
}
//inače te dodatne opcije u našem sortiranju se dodaju kao treći argument u funkciji sort. sort(niz,niz+n,cmp);
Ukoliko smo željeli sortirati u rastučem redoslijedu onda samo u vračanju vrijednosti logičkih vrijednosti promijeniš > u <. Ukoliko ima još nekih pitanja slobodno se javite.

2 komentara:

  1. C++0x Komparatori više nisu u modi. Ja više volim lambde:

    #include
    #include
    using namespace std;

    struct coord { int x, y; };
    coord arr[] = { {3, 6}, {3, 4}, {1, 1} };

    int main()
    {
    sort(arr, arr+3, [](const coord& a, const coord& b)
    {
    if (a.x == b.x) return a.y < b.y;
    return a.x < b.x;
    });

    for (auto& a : arr)
    cout << a.x << " " << a.y << '\n';
    }

    OdgovoriIzbriši
    Odgovori
    1. Ja više volim overridati operatore, i koristiti strukture iz headera , a za ispisavanje korisim copy() i ostream_iterator
      Prrimjer 1. s originalnog posta: http://pastebin.com/pyMxLmRG
      Primjer 2. sort(niz, niz+n, greater())
      Padajući redoslijed coord-ova: sort(niz, niz+n, greater())
      Tvoj primjer, Mislave: http://pastebin.com/1RkfGcTt

      Izbriši