Modul 1 (Iterator) - Algoritma-dan-Pemrograman-ITS/StrukturData GitHub Wiki
Setelah satu tahun 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.
#include <iostream>
namespace test{
int a = 5;
}
int main(){
int a = 6;
std::cout << a << std::endl;
std::cout << test::a << std::endl;
/*
kedua variabel di atas memiliki nama dan tipe data yang sama,
namun dibedakan melalui namespace
*/
return 0;
}
std
sendiri adalah sebuah namespace bawaan dari bahasa C++. Kita dapat menggunakan using namespace std;
untuk mempersingkat penulisan kode.
#include <iostream>
using namespace std;
namespace test{
int a = 5;
}
int main(){
int a = 6;
cout << a << endl;
cout << test::a << endl;
return 0;
}
-
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 (tenang, tidak semuanya harus dipelajari saat mata kuliah struktur data).
Catatan: semua library yang berlaku di C juga berlaku di C++, namun tidak sebaliknya.
Sebelum kita membahas iterator
, teman-teman harus mengetahui apa itu STL
. STL
(Standard Template Library) adalah sekumpulan template class untuk beberapa fungsi dan struktur data (dapat disebut juga container) yang lazim digunakan. iterator
disini adalah layaknya pointer yang digunakan untuk mengakses blok memori pada struktur data yang ada dalam STL
.
Secara umum, iterator
dapat dideklarasikan seperti berikut
STL_container<tipe_data>::iterator nama_variabel;
list<int>::iterator pointer;
Semua STL Container memiliki sepasang fungsi yaitu fungsi begin()
dan end()
. Fungsi begin()
adalah sebuah fungsi yang mengembalikan sebuah iterator yang menunjuk pada elemen pertama dari sebuah STL Container. Sedangkan, fungsi end()
mengembalikan sebuah iterator yang menunjuk pada elemen kosong setelah elemen terakhir. Berikut adalah ilustrasinya.
Kedua fungsi ini juga memiliki versi kebalikan dari mereka, yaitu rbegin()
dan rend()
.
Salah satu aplikasi yang sering digunakan dari fungsi-fungsi diatas adalah untuk melakukan pengurutan menggunakan fungsi sort()
#include <bits/stdc++.h>
/*
penggunaan library diatas adalah untuk mengurangi
penulisan library pada Bahasa C++ yang memang banyak
atau dalam kata lain, library diatas mengandung
semua library Bahasa C++
jika memiliki kesulitan dengan penggunaan library diatas,
fungsi sort ada pada library algorithm
*/
using namespace std;
int main(){
vector<int> v{3, 4, 2, 5, 1, 7};
/*
proses inisialisasi sebuah vector
tidaklah sama dengan inisialisasi array biasa
*/
sort(v.begin(), v.end());
for(int i=0; i<v.size(); i++){
cout << v[i] << " ";
// vector akan urut secara ascending
}
cout << endl;
sort(v.rbegin(), v.rend());
for(int i=0; i<v.size(); i++){
cout << v[i] << " ";
//vector akan urut secara descending
}
cout << endl;
return 0;
}
auto
adalah sebuah reserved word pada Bahasa C++. auto
akan membuat program melakukan spesifikasi pada tipe data sebuah variabel dengan melihat nilai yang diinisialisasikan (variabel harus diinisialisasikan sebuah nilai pada saat menggunakan auto
) pada variabel tersebut.
Karenanya, keyword auto
akan sangat berguna untuk menghindari penulisan tipe data yang panjang seperti tipe data iterator.
Pada contoh di atas, tipe data dari variabel pointer
otomatis mengikuti dengan tipe data dari iterator
milik vector
.
iterator
memiliki beberapa operator seperti increment(++), decrement(--)(tidak semua jenis operator dapat dilakukan operasi decrement) dan dereference(*). Sebenarnya, banyak sekali operator yang dapat dilakukan pada iterator
, tergantung pada jenis iterator
tersebut (selengkapnya lihat di sini).
Berikut adalah contoh penggunaan operator increment dan dereference.
#include <bits/stdc++.h>
using namespace std;
int main(){
list<int> l{1, 2, 3, 4, 5};
auto pointer = l.begin();
pointer++;
// variabel pointer sekarang menunjuk elemen kedua dari list
cout << *pointer << endl;
/*
syntax diatas akan mengeluarkan isi dari blok memori yang
sekarang ditunjuk oleh variabel pointer yaitu 2
*/
return 0;
}
Dengan operator increment dan dereference, kita dapat mengakses semua elemen pada suatu STL Container tanpa harus mengosongkan STL Container seperti yang ada pada modul linked list.
#include <bits/stdc++.h>
using namespace std;
int main(){
list<int> l{1, 2, 3, 4, 5};
for(auto it = l.begin(); it != l.end(); it++){
cout << *it << endl;
}
return 0;
}
Apakah ada cara yang lebih singkat untuk iterasi pada seluruh elemen STL Container? Tentu saja ada.
#include <bits/stdc++.h>
using namespace std;
int main(){
list<int> l{1, 2, 3, 4, 5};
for(auto it:l){
cout << it << endl;
}
return 0;
}
(perhatikan bahwa tipe data dari variabel it
sudah bukan merupakan iterator lagi).