Modul 3 - Schematics-NPC-2021/Tutorial-Schematics-NPC-Junior-2021 GitHub Wiki
Setelah belajar C, sekarang kita akan mempelajari C++.
C++ merupakan bahasa pemrograman yang dikembangkan dari bahasa C.
-
Library
<iostream>
Library ini menyediakan fungsi dasar input output.-
cin
- standard input -
cout
- standard output
Trivia: Apa perbedaan
cin
denganscanf
dancout
denganprintf
?
Hint: Silahkan perhatikan contoh implementasi. -
-
namespace
Pada C, biasanya kita menggunakan prefix pada identifier untuk menghindari konflik nama.namespace
dapat diibaratkan sebagai wadah yang digunakan untuk mengelompokkan fungsi (atau data lainnya) sehingga menjadi dapat dibedakan. -
class
Familiar denganstruct
?class
juga merupakan User Defined Data Type. Satu-satunya perbedaan adalah default dari access modifier-nya. Pada struct default-nya adalahpublic
, sedangkan padaclass
default-nya adalahprivate
(akan dipelajari lebih lanjut di mata kuliah Pemrograman Berorientasi Objek, jangan bingung dulu hehe). -
template
Untuk membuat sebuah fungsi atauclass
yang dapat menyesuaikan dan bekerja dengan tipe data yang berbeda, maka gunakanlahtemplate
. -
dan masih banyak lagi...
Catatan: semua library yang berlaku di C juga berlaku di C++, namun tidak sebaliknya.
Apa arti
using namespace std;
pada contoh implementasi?
standard library pada C++ memakai prefixstd::
supaya dapat digunakan. Maka, untuk menghindari penulisan prefix tersebut berulang-ulang, ditambahkan baris tersebut pada program.
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.
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_range
saat 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.
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_range
saat 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.
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.
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).
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).
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_range
saat 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).
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
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
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()
.
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
Untuk informasi lebih detail mengenai STL dapat dibaca di : cplusplus.com Khusus untuk PBDS dapat dilihat di : https://codeforces.com/blog/entry/11080