Modul 4 (STL Container) - AlproITS/StrukturData GitHub Wiki
C++ Standard Template Library Container
Container adalah sebuah obyek yang digunakan untuk menyimpan sekumpulan obyek lain (disebut sebagai elemen pada container tersebut) dan mengatur ruang penyimpanannya.
Pada C++, container diimplementasikan sebagai template class, sehingga tersedia fungsi-fungsi untuk mengakses elemen-elemennya.
std::array
Contoh implementasi lengkap std::array
Masih ingat Array?
std::array merupakan jenis struktur data yang menampung elemen secara sekuensial dengan ukuran (kapasitas) yang tetap (fixed-size).
Operasi-operasi pada std::array:
operator[]- Mengakses elemen di posisi spesifik.at()- Mengakses elemen di posisi spesifik sekaligus mengecek batas ukuran array. Mengembalikan nilai yang sama denganoperator[]. Perbedaannya adalah ketika indeks elemen yang akan diakses melebihi batas ukuran array. Padaat(),program akan melemparkan errorout_of_rangesaat dijalankan. Padaoperator[], hal tersebut menyebabkan undefined behavior.front()- Mengakses elemen di posisi pertama.back()- Mengakses elemen di posisi terakhir.begin()- Sebuah iterator untuk awal sekuens.end()- Sebuah iterator untuk elemen setelah akhir sekuens.size()- Mendapatkan jumlah elemen.max_size()- Mendapatkan jumlah maksimal elemen yang dapat ditampung oleh array. Mengembalikan nilai yang sama dengansize().empty()- Memeriksa apakah array kosong atau tidak. Jika ukuran array adalah 0, mengembalikan nilaitrue. Jika tidak, mengembalikan nilaifalse.swap()- Menukar seluruh elemen pada sebuah array dengan seluruh elemen pada array lain yang memiliki tipe data dan ukuran yang sama.fill()- Mengisi seluruh elemen pada array dengan nilai tertentu.
std::vector
Contoh implementasi lengkap std::vector
Masih ingat Dynamic Array?
std::vector merupakan jenis struktur data yang merepresentasikan array dengan kemampuan untuk berubah ukuran (kapasitas) secara dinamis sesuai dengan banyaknya data yang dimasukkan.
Operasi-operasi pada std::vector:
operator[]- Mengakses elemen di posisi spesifik.at()- Mengakses elemen di posisi spesifik sekaligus mengecek batas ukuran vector. Mengembalikan nilai yang sama denganoperator[]. Perbedaannya adalah ketika indeks elemen yang akan diakses melebihi batas ukuran vector. Padaat(),program akan melemparkan errorout_of_rangesaat dijalankan. Padaoperator[], hal tersebut menyebabkan undefined behavior.front()- Mengakses elemen di posisi pertama.back()- Mengakses elemen di posisi terakhir.begin()- Sebuah iterator untuk awal sekuens.end()- Sebuah iterator untuk elemen setelah akhir sekuens.size()- Mendapatkan jumlah elemen.max_size()- Mendapatkan jumlah maksimal elemen yang dapat ditampung oleh vector.resize()- Mengubah ukuran vector menjadi jumlah elemen tertentu.resize()juga dapat disertai dengan menetapkan nilai tertentu, namun tidak akan mengubah elemen yang sudah ada nilainya sebelumnya (berbeda denganassign()).empty()- Memeriksa apakah vector kosong atau tidak. Jika ukuran vector adalah 0, mengembalikan nilaitrue. Jika tidak, mengembalikan nilaifalse.assign()- Menetapkan ukuran vector menjadi jumlah elemen tertentu dengan nilai tertentu pada seluruh elemennya.push_back()- Menambahkan elemen di posisi terakhir.pop_back()- Menghapus elemen terakhir.insert()- Memasukkan nilai di posisi (atau range) spesifik.erase()- Menghapus nilai di posisi (atau range) spesifik.clear()- Menghapus seluruh elemen, sehingga ukuran vector menjadi 0.swap()- Menukar seluruh elemen pada sebuah vector dengan seluruh elemen pada vector lain yang memiliki tipe data yang sama (ukuran dapat berbeda).sort(first,last)- Mengurutkan elemen pada array secara descending pada rentang [first,last).lower_bound(first,last,val)- Mengembalikan iterator yang menunjuk pada elemen terkecil yang tidak kurang dari $val$ pada rentang [first,last). Jika tidak ada, maka akan mengembalikan iterator last.upper_bound(first,last,val)- Mengembalikan iterator yang menunjuk pada elemen terkecil yang lebih dari $val$ pada rentang [first,last). Jika tidak ada, maka akan mengembalikan iterator last.
std::list
Contoh implementasi lengkap std::list
Masih ingat Linked List?
std::list merupakan jenis struktur data yang menampung elemen secara sekuensial dan mampu melakukan operasi insert() dan erase() secara constant time.
Operasi-operasi pada std::list:
front()- Mengakses elemen di posisi pertama.back()- Mengakses elemen di posisi terakhir.begin()- Sebuah iterator untuk awal sekuens.end()- Sebuah iterator untuk elemen setelah akhir sekuens.size()- Mendapatkan jumlah elemen.max_size()- Mendapatkan jumlah maksimal elemen yang dapat ditampung oleh list.resize()- Mengubah ukuran list menjadi jumlah elemen tertentu.resize()juga dapat disertai dengan menetapkan nilai tertentu, namun tidak akan mengubah elemen yang sudah ada nilainya sebelumnya (berbeda denganassign()).empty()- Memeriksa apakah list kosong atau tidak. Jika ukuran list adalah 0, mengembalikan nilaitrue. Jika tidak, mengembalikan nilaifalse.assign()- Menetapkan ukuran list menjadi jumlah elemen tertentu dengan nilai tertentu pada seluruh elemennya.push_front()- Menambahkan elemen di posisi pertama.pop_front()- Menghapus elemen di posisi pertama.push_back()- Menambahkan elemen di posisi terakhir.pop_back()- Menghapus elemen di posisi terakhir.insert()- Memasukkan nilai di posisi (atau range) spesifik.erase()- Menghapus nilai di posisi (atau range) spesifik.clear()- Menghapus seluruh elemen, sehingga ukuran list menjadi 0.swap()- Menukar seluruh elemen pada sebuah list dengan seluruh elemen pada list lain yang memiliki tipe data yang sama (ukuran dapat berbeda).reverse()- Membalikkan urutan posisi elemen.sort()- Mengurutkan seluruh elemen secara ascending (default, dapat diubah).merge()- Memindahkan seluruh elemen pada sebuah list ke list lain, dengan syarat kedua list sudah terurut, sehingga seluruh elemen pada list tujuan pun terurut.splice()- Memindahkan seluruh elemen atau elemen tertentu pada sebuah posisi spesifik di list tersebut atau list lain.unique()- Menghapus elemen duplikat pada sebuah list, menyisakan sebuah list yang berisikan elemen-elemen unik.remove()- Menghapus elemen dengan nilai tertentu. Berbeda denganerase()yang menghapus berdasarkan posisi elemen,remove()menghapus elemen berdasarkan nilainya.remove_if()- Menghapus elemen dengan nilai tertentu yang memenuhi syarat tertentu.
std::stack
Contoh implementasi lengkap std::stack
Masih ingat Stack?
std::stack merupakan jenis struktur data dinamis yang mengikuti prinsip Last In First Out (LIFO).
Operasi-operasi pada std::stack:
top()- Mengakses elemen di posisi pertama.size()- Mendapatkan jumlah elemen.empty()- Memeriksa apakah stack kosong atau tidak. Jika ukuran stack adalah 0, mengembalikan nilaitrue. Jika tidak, mengembalikan nilaifalse.push()- Menambahkan elemen di posisi pertama.pop()- Menghapus elemen di posisi pertama.swap()- Menukar seluruh elemen pada sebuah stack dengan seluruh elemen pada stack lain yang memiliki tipe data yang sama (ukuran dapat berbeda).
std::queue
Contoh implementasi lengkap std::queue
Masih ingat Queue?
std::queue merupakan jenis struktur data dinamis yang mengikuti prinsip First In First Out (FIFO).
Operasi-operasi pada std::queue:
front()- Mengakses elemen di posisi pertama.back()- Mengakses elemen di posisi terakhir.size()- Mendapatkan jumlah elemen.empty()- Memeriksa apakah queue kosong atau tidak. Jika ukuran queue adalah 0, mengembalikan nilaitrue. Jika tidak, mengembalikan nilaifalse.push()- Menambahkan elemen di posisi pertama.pop()- Menghapus elemen di posisi terakhir.swap()- Menukar seluruh elemen pada sebuah queue dengan seluruh elemen pada queue lain yang memiliki tipe data yang sama (ukuran dapat berbeda).
std::deque
Contoh implementasi lengkap std::deque
Masih ingat Deque?
std::deque (double-ended queue) merupakan jenis struktur data dinamis yang dapat menambah data atau mengurangi data baik di posisi awal maupun posisi akhir.
Operasi-operasi pada std::deque:
operator[]- Mengakses elemen di posisi spesifik.at()- Mengakses elemen di posisi spesifik sekaligus mengecek batas ukuran deque. Mengembalikan nilai yang sama denganoperator[]. Perbedaannya adalah ketika indeks elemen yang akan diakses melebihi batas ukuran deque. Padaat(),program akan melemparkan errorout_of_rangesaat dijalankan. Padaoperator[], hal tersebut menyebabkan undefined behavior.front()- Mengakses elemen di posisi pertama.back()- Mengakses elemen di posisi terakhir.begin()- Sebuah iterator untuk awal sekuens.end()- Sebuah iterator untuk elemen setelah akhir sekuens.size()- Mendapatkan jumlah elemen.max_size()- Mendapatkan jumlah maksimal elemen yang dapat ditampung oleh deque.resize()- Mengubah ukuran deque menjadi jumlah elemen tertentu.resize()juga dapat disertai dengan menetapkan nilai tertentu, namun tidak akan mengubah elemen yang sudah ada nilainya sebelumnya (berbeda denganassign()).empty()- Memeriksa apakah deque kosong atau tidak. Jika ukuran deque adalah 0, mengembalikan nilaitrue. Jika tidak, mengembalikan nilaifalse.assign()- Menetapkan ukuran deque menjadi jumlah elemen tertentu dengan nilai tertentu pada seluruh elemennya.push_front()- Menambahkan elemen di posisi pertama.pop_front()- Menghapus elemen di posisi pertama.push_back()- Menambahkan elemen di posisi terakhir.pop_back()- Menghapus elemen di posisi terakhir.insert()- Memasukkan nilai di posisi (atau range) spesifik.erase()- Menghapus nilai di posisi (atau range) spesifik.clear()- Menghapus seluruh elemen, sehingga ukuran deque menjadi 0.swap()- Menukar seluruh elemen pada sebuah deque dengan seluruh elemen pada deque lain yang memiliki tipe data yang sama (ukuran dapat berbeda).
std::priority_queue
Contoh implementasi lengkap std::priority_queue
Masih ingat Priority Queue?
std::priority_queue merupakan jenis struktur data dinamis yang dapat otomatis menampung elemen dengan susunan terurut secara descending (default, dapat diubah).
Operasi-operasi pada std::priority_queue:
top()- Mengakses elemen di posisi pertama.size()- Mendapatkan jumlah elemen.empty()- Memeriksa apakah priority queue kosong atau tidak. Jika ukuran priority queue adalah 0, mengembalikan nilaitrue. Jika tidak, mengembalikan nilaifalse.push()- Menambahkan elemen di posisi pertama.pop()- Menghapus elemen di posisi terakhir.swap()- Menukar seluruh elemen pada sebuah priority queue dengan seluruh elemen pada priority queue lain yang memiliki tipe data yang sama (ukuran dapat berbeda).cpp)
std::map
Contoh implementasi lengkap std::map
std::map merupakan associative container yang menampung elemen dengan dalam bentuk key-value.
Operasi-operasi pada std::map:
operator[]- Mengakses value dari suatu key.begin()- Sebuah iterator untuk awal sekuens.end()- Sebuah iterator untuk elemen setelah akhir sekuens.size()- Mendapatkan jumlah elemen.max_size()- Mendapatkan jumlah maksimal elemen yang dapat ditampung oleh map.empty()- Memeriksa apakah map kosong atau tidak. Jika ukuran map adalah 0, mengembalikan nilaitrue. Jika tidak, mengembalikan nilaifalse.insert()- Memasukkan nilai di posisi (atau range) spesifik.erase()- Menghapus nilai di posisi (atau range) spesifik.clear()- Menghapus seluruh elemen, sehingga ukuran map menjadi 0.swap()- Menukar seluruh elemen pada sebuah map dengan seluruh elemen pada map lain yang memiliki tipe data yang sama (ukuran dapat berbeda).find()- Menemukan elemen berdasarkan key.count()- Mencari jumlah elemen dengan nilai yang sama.
std::set
Contoh implementasi lengkap std::set
std::set merupakan associative container yang menampung elemen dalam bentuk key-value, dimana value-nya merupakan key-nya, sehingga setiap elemen merupakan elemen yang unik.
Operasi-operasi pada std::set:
-
begin()- Sebuah iterator untuk awal sekuens. -
end()- Sebuah iterator untuk elemen setelah akhir sekuens. -
size()- Mendapatkan jumlah elemen. -
max_size()- Mendapatkan jumlah maksimal elemen yang dapat ditampung oleh set. -
empty()- Memeriksa apakah set kosong atau tidak. Jika ukuran set adalah 0, mengembalikan nilaitrue. Jika tidak, mengembalikan nilaifalse. -
insert()- Memasukkan nilai di posisi (atau range) spesifik. -
erase()- Menghapus nilai di posisi (atau range) spesifik. -
clear()- Menghapus seluruh elemen, sehingga ukuran set menjadi 0. -
swap()- Menukar seluruh elemen pada sebuah set dengan seluruh elemen pada set lain yang memiliki tipe data yang sama (ukuran dapat berbeda). -
find()- Menemukan elemen berdasarkan key. -
count()- Mencari jumlah elemen dengan nilai yang sama. Karena setiap elemen di set merupakan elemen yang unik, maka jika elemen ditemukan akan mengembalikan nilai1, sedangkan jika tidak ditemukan akan mengembalikan nilai0. -
lower_bound(val)- mengembalikan iterator yang menunjuk ke key yang memiliki nilai terkecil yang tidak lebih kecil dari $val$. Jika tidak ada, maka akan mengembalikan iteratorend(). -
upper_bound(val)- mengembalikan iterator yang menunjuk ke key yang memiliki nilai terkecil yang lebih besar dari $val$. Jika tidak ada, maka akan mengembalikan iteratorend().
Policy-Based Data Structure (PBDS)
Contoh implementasi lengkap PBDS
Kurang lebih, struktur data ini berfungsi sama seperti std::set tetapi, memiliki tambahan fungsi lain yaitu :
find_by_order(k)- Mengembalikan bilangan pada urutan ke - K jika diurutkan secara ascending.order_of_key(val)- Mengembalikan banyaknya bilangan yang memiliki nilai lebih kecil dari $val$.
Implementasi map, set, priority_queue, dan PBDS menggunakan struktur data balanced binary search tree atau heap yang menyebabkan pengaksesan elemen pada STL tersebut membutuhkan waktu yang logaritmik terhadap jumlah elemennya $O(lg N)$.
Sedangkan STL lain yang dijelaskan di modul ini membutuhkan waktu konstan untuk mengakses elemen-elemennya $O(1)$.
Untuk informasi lebih detail mengenai STL dapat dibaca di : cplusplus.com Khusus untuk PBDS dapat dilihat di : https://codeforces.com/blog/entry/11080