Set

Set adalah tipe data yang terdapat dalam STL. Cara penyimpanan mirip dengan himpunan yang semua anggotanya unik. Artinya, tidak ada satupun data yang sama di dalam set. Isi set bisa diakses dengan menggunakan indeks seperti array.

Untuk menggunakan set pada C++ kita bisa menambahkan "#include <set>". Berikut ini adalah contoh kode programnya.

#include <iostream>
#include <set>

using namespace std;

int main(){
set<string> himpunan;

    //Isi set
    himpunan.insert("saya");
    himpunan.insert("kamu");
    himpunan.insert("dia");
    himpunan.insert("mereka");
    himpunan.insert("kalian");
    himpunan.insert("dia");

    cout << "Ukuran : " << himpunan.size();
    cout << endl;
    
    cout << "Isi : " << endl;
     for (auto p = himpunan.begin(); p != himpunan.end(); ++p)
        std::cout << *p << endl;
    
    himpunan.clear();//Bersihkan set

    return 0;
}
Output :
Ukuran : 5
Isi :
dia
kalian
kamu
mereka
saya

Contoh kode program di atas menggunakan set yang key-nya bertipe isinya bertipe int. Tipe data pada deklarasi set menggunakan tipe data isinya yang diapit dengan tanda "<" dan ">". 

Pada kode program di atas, kita menambahkan data pada set dengan menggunakan function insert dan menampilkannya dengan menggunakan cout. Fungsi insert tidak dapat menambahkan dua data yang sama pada variabel bertipe data set.

Inisiasi set hampir sama dengan array. Tipenya harus sesuai tipe data isinya saat deklarasi set. Kalian bisa menggunakan for dengan iterator (dengan tipe data auto) untuk melihat semua isi set. Isi set bisa dicetak dengan pointer dari iterator tersebut.

Set tidak memiliki method untuk melihat isi berdasarkan indeks. Jadi, kalian perlu menggunakan loop untuk melihat semua isinya.

"set<string> himpunan" bisa diganti dengan "set<tipe_data_nilai> nama_variabel". Kalian bisa menggunakan set dengan tipe data lain selain tipe data string.

Menampilkan Semua Data

Untuk menampilkan beberapa data sekaligus, kalian membutuhkan iterator yang digeser posisi pointernya dengan operator increment (++) di dalam for. Kalian juga membutuhkan method begin dan end untuk menampilkan data sesuai urutan aslinya. Jika kalian ingin menampilkan data secara terbalik, kalian bisa menggunakan rbegin dan rend.

#include <iostream>
#include <set>

using namespace std;

int main(){
    set<string> himpunan=
    { "ab", "aa", "bc", "cd", "de"};

    himpunan.erase("ab");

    cout << "Data (asli) : ";
    for (auto p = himpunan.begin(); p != himpunan.end(); ++p)
        cout << *p << " ";

    cout << endl << "Data (terbalik) : ";
    for (auto p = himpunan.rbegin(); p != himpunan.rend(); ++p)
        cout << *p << " ";
    return 0;
}
Output :
Data (asli) : aa bc cd de
Data (terbalik) : de cd bc aa

Kalian bisa menambah data set dengan menggunakan method insert. Sebaliknya, kalian bisa menggunakan erase untuk menghapus isi set.

Beberapa method yang biasa digunakan dalam set adalah sebagai berikut :

  1. insert => Menambahkan data.
  2. erase => Menghapus data berdasarkan nilainya.
  3. front => Menunjukkan nilai data pada elemen pertama dalam set. 
  4. back => Menunjukkan nilai data pada elemen terakhir dalam set
  5. size => Mengembalikan nilai berupa ukuran set
  6. max_size => Mengembalikan ukuran maksimum yang bisa dicapai set berdasarkan batasan sistem disaat memori masih tersedia.
  7. clear => Mengosongkan set
  8. begin => Mengembalikan iterator berupa pointer yang menunjuk nilai pertama dari set.
  9. end => Mengembalikan iterator berupa pointer yang menunjuk akhir dari set.

Unordered Set

Unordered_set hampir sama dengan set. Bedanya cuma ada di cara penyimpanannya. Set menyimpan isinya secara terurut walaupun inisiasinya acak. Sebaliknya, unordered_set menyimpan isinya sesuai dengan urutan aslinya saat inisiasi atau penambahan data dengan insert.

#include <iostream>
#include <set>
#include <unordered_set>

using namespace std;

int main(){
    set<string> himpunan1=
    { "ab", "za", "xc", "cd", "de"};
    unordered_set<string> himpunan2=
    { "ab", "za", "xc", "cd", "de"};

    cout << "Ordered : ";
    for (auto p = himpunan1.begin(); p != himpunan1.end(); ++p)
        cout << *p << " ";

    cout << endl << "Unordered : "; 
    for (auto p = himpunan2.begin(); p != himpunan2.end(); ++p)
        cout << *p << " ";

    return 0;
}
Output :
Ordered : ab cd de xc za
Unordered : de cd xc za ab

Walaupun inisiasinya sama, hasilnya berbeda karena adanya pengurutan untuk container set biasa.

Untuk menggunakan unordered set, kalian harus menyertakan header <unordered_set>.

Multiset

Varian lain dari set adalah multiset. Multiset punya method yang sama dengan set. Seperti set, multi set tidak bisa diakses berdasarkan index. Selain itu, multiset bisa berisi beberapa nilai atau data yang sama.

#include <iostream>
#include <multiset>

using namespace std;

int main(){
multiset<string> himpunan;

    //Isi set
    himpunan.insert("saya");
    himpunan.insert("kamu");
    himpunan.insert("dia");
    himpunan.insert("mereka");
    himpunan.insert("kalian");
    himpunan.insert("dia");

    cout << "Ukuran : " << himpunan.size();
    cout << endl;
    
    cout << "Isi : " << endl;
     for (auto p = himpunan.begin(); p != himpunan.end(); ++p)
        std::cout << *p << endl;
    
    himpunan.clear();//Bersihkan set

    return 0;
}

Seperti set, multiset isinya diurutkan. Header yang digunakan sama, yaitu <set> karena tidak ada header <multiset>