Modul 1 (Iterator) - Algoritma-dan-Pemrograman-ITS/StrukturData GitHub Wiki

Pengenalan Bahasa C++ dan Iterator Dasar

Setelah satu tahun belajar C, sekarang kita akan mempelajari C++.

C++

C++ merupakan bahasa pemrograman yang dikembangkan dari bahasa C.

Apa saja yang baru di C++?

  • Library <iostream>
    Library ini menyediakan fungsi dasar input output.

    • cin - standard input
    • cout - standard output

    Trivia: Apa perbedaan cin dengan scanf dan cout dengan printf?
    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 dengan struct? class juga merupakan User Defined Data Type. Satu-satunya perbedaan adalah default dari access modifier-nya. Pada struct default-nya adalah public, sedangkan pada class default-nya adalah private (akan dipelajari lebih lanjut di mata kuliah Pemrograman Berorientasi Objek, jangan bingung dulu hehe).

  • template
    Untuk membuat sebuah fungsi atau class yang dapat menyesuaikan dan bekerja dengan tipe data yang berbeda, maka gunakanlah template.

  • 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.

iterator

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.

Deklarasi

Secara umum, iterator dapat dideklarasikan seperti berikut

STL_container<tipe_data>::iterator nama_variabel;
list<int>::iterator pointer;

Fungsi begin() dan end()

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.

begin dan end

Kedua fungsi ini juga memiliki versi kebalikan dari mereka, yaitu rbegin() dan rend().

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

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.

ilustrasi auto

Pada contoh di atas, tipe data dari variabel pointer otomatis mengikuti dengan tipe data dari iterator milik vector.

Operator Pada iterator

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).

Soal Latihan>

⚠️ **GitHub.com Fallback** ⚠️