Sort with STL (Part 2 : Sorting structs / objects)

Pada artikel pertama, kita telah sedikit mengenal cara pemakaian sort di STL, sekarang kita akan belajar bagaimana mensorting structs atau objects. Semisal, kita telah membuat object “Nilai_siswa” (dengan struct) sbb:

struct Nilai_siswa{

int NIM;

int nilai;

int peringkat_kelas;

};

kalau seperti ini kondisinya, kita tidak bisa secara langsung menggunakan fungsi sort pada STL. Kita perlu membuat fungsi komparasi dengan menggunakan salah satu variabel dari struct Nilai_siswa sebagai patokan untuk melakukan sorting. Jika tidak, akan menjadi rancu, tidak ada acuan pembanding antara object yang satu dengan yang lainnya. Semisal ada 2 buah Nilai_siswa, sbb:

Nilai_siswa A,B;

A.peringkat_kelas = 5;

A.nilai = 30;

B.peringkat_kelas = 9;

B.nilai = 90;

jika tidak dibuat fungsi komparasi yang menjelaskan tentang hubungan perbandingan nilai diantara 2 objek yang bertipe sama (dalam kasus ini Nilai_siswa sebagai tipe datanya), maka fungsi sort tidak akan bisa dipakai, karena apa yang jadi acuan pembanding antara kedua Nilai_siswa tadi, apakah peringkat_kelas -nya atau nilai -nya?

Semisal, kita menjadikan variabel nilai sebagai acuan perbandingan. Maka, implementasinya adalah sebagai berikut :

//fungsi komparasi atau acuan pembanding

bool operator < (const Nilai_siswa &x, const Nilai_siswa &y){

return x.nilai < y.nilai; //ini adalah acuan pembanding dari dua objek Nilai_siswa

}

Pada contoh diatas jika : A < B , maka sebenarnya kita sedang membandingkan A.nilai < B.nilai

So, jika kita sudah membuat fungsi komparasi seperti diatas, kita dapat menggunakan fungsi sort pada STL.

#include<algorithm>

#include<iostream>

using namespace std;

struct Nilai_siswa{

int NIM;

int nilai;

int peringkat_kelas;

};

bool operator < (const Nilai_siswa &x, const Nilai_siswa &y){

return x.nilai < y.nilai; //ini adalah acuan pembanding dari dua objek Nilai_siswa

}

int main(void){

int n;

n=3;

Nilai_siswa A[n];

A[0].peringkat_kelas = 5;

A[0].nilai = 30;

A[1].peringkat_kelas = 9;

A[1].nilai = 90;

A[2].peringkat_kelas = 7;

A[2].nilai = 23;

sort(A,A+n);

for(int i=0;i<n;i++) cout<<A[i].peringkat_kelas<<” “; //hasilnya 7 5 9

cout<<endl;

for(int i=0;i<n;i++) cout<<A[i].nilai<<” “; //hasilnya 23 30 90

}

atau ada cara lain, yaitu :

gantilah code berikut :

bool operator < (const Nilai_siswa &x, const Nilai_siswa &y){

return x.nilai < y.nilai; //ini adalah acuan pembanding dari dua objek Nilai_siswa

}

dengan :

bool compare(const Nilai_siswa &x, const Nilai_siswa &y) {
return x.nilai < y.nilai; /* tanda < berarti X < Y = X.nilai < Y.nilai (sorting secara ascending), tanda > berarti X < Y = X.nilai > Y.nilai (sorting secara descending) */
}

Lalu, ganti juga code berikut :

sort(A,A+n);

dengan :

sort(A,A+n, compare);

sekali lagi….Selamat mencoba🙂

3 Responses so far »

  1. 1

    Felix J said,

    kalo kek gini, bs juga di akalin dengan vector🙂

    vector<pair<int,pair > > v;

    *int yang pertama adalah value yang disort…*

    cara masukinnya tinggal pake

    v.push_back(make_pair(1,make_pair(2,3)));

    pas di ekstrak pake
    pair<int,pair > p;
    p = v.front();

    untuk dapetin hasil 1 maka dengan cara…

    printf(“%d\n”, p.first);

    untuk 2 dan 3…
    printf(“%d %d\n”, p.second.first,p.second.second);

    pas di sort tinggal sama aja kek sort vector…

    sort(v.begin(),v.end());

    ini sortnya berdasar value yang pertama…🙂

  2. 2

    brainplusplus said,

    masalahnya kalo variable struct atau objectnya banyak gak bisa pake vector…ribet😀,
    misal struct data_siswa punya variable nilai, peringkat, umur, nama, dll. maka implementasi menggunakan vector akan sangat-sangat menyulitkan…dan paling mudah adalah menggunakan cara diatas….:)

  3. 3

    suhendry said,

    @felixj:
    itu sortnya bukan cuma “berdasarkan” value yang pertama. tapi “prioritas”-nya adalah value yang pertama. value yang lain juga tetap diperhitungkan ketika value yang pertama sama.

    eniwei, gw juga lebih sering pake cara brain++, resiko salah lebih kecil dan lebih gampang di debug😀


Comment RSS · TrackBack URI

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: