kursus-programming-dasar

By | September 27, 2025

 

C++ Algorithms: Panduan Master Implementasi Algoritma dengan C++ Standard Library

Pernah nggak sih kamu menghabiskan berjam-jam menulis kode untuk mengurutkan data, mencari elemen dalam array, atau memproses koleksi data, padahal sebenarnya C++ sudah menyediakan solusinya yang siap pakai? Jika iya, selamat datang di dunia C++ Algorithms—perpustakaan algoritma siap pakai yang akan mengubah cara kamu memprogram selamanya!

Bayangkan kamu punya kotak perkakas lengkap dengan berbagai alat khusus: ada obeng, tang, kunci inggris, dan masih banyak lagi. Daripada mencoba membuka baut dengan gigi (yang pasti sakit!), lebih baik pakai kunci yang tepat. Standard Template Library (STL) Algorithms di C++ adalah kotak perkakas itu. Mereka adalah kumpulan fungsi template yang sudah dioptimalkan dan teruji untuk melakukan operasi umum pada data. Artikel ini akan membimbing kamu memahami cara memanfaatkan kekuatan ini dengan gaya yang santai dan penuh contoh praktis. Siap untuk berhenti “reinvent the wheel” dan mulai coding dengan lebih pintar?

Kenapa Harus Menggunakan C++ Standard Algorithms?

Sebelum kita menyelam ke kodenya, mari pahami dulu mengapa algorithms STL ini sangat spesial.

  • Sudah Teroptimasi: Algoritma-algoritma ini ditulis oleh expert dan dioptimasi untuk performa. Kode kamu akan lebih cepat tanpa effort extra.
  • Bebas Bug (Well-Tested): Sudah digunakan oleh jutaan programmer selama puluhan tahun. Kemungkinan bug sangat kecil dibandingkan kode yang kamu tulis sendiri.
  • Ekspresif dan Mudah Dibaca: Kode menjadi lebih deklaratif. Daripada menjelaskan “bagaimana” melakukannya (dengan loop manual), kamu cukup menyebutkan “apa” yang ingin dilakukan.
  • Konsisten: Interface-nya konsisten. Begitu kamu pahami satu algoritma, belajar yang lain jadi lebih mudah.

Analoginya: Memasak dengan Bumbu Instan vs dari Bahan Dasar

Menulis loop manual untuk setiap operasi itu seperti menggiling bumbu dengan cobek setiap kali mau masak. Pakai STL Algorithms itu seperti pakai bumbu instan yang sudah diracik sempurna—tinggal tambahkan, hasilnya enak dan konsisten!

Prasyarat: Memahami Iterators adalah Kunci!

Sebelum bisa menggunakan algorithms dengan lancar, kamu harus paham konsep iterators. Iterator itu seperti pointer yang canggih; mereka adalah objek yang menunjuk ke elemen dalam container (seperti vector, list, array).

Bayangkan iterator sebagai jari kamu yang sedang menelusuri daftar belanjaan. Kamu bisa menggerakkannya ke elemen berikutnya, dan dia tahu kapan sudah sampai di akhir.

Dua iterator yang paling penting:

  • .begin(): Iterator yang menunjuk ke elemen pertama.
  • .end(): Iterator yang menunjuk ke elemen setelah elemen terakhir (bukan elemen terakhir itu sendiri!). Ini adalah penanda akhir.

Hampir semua algoritma STL bekerja pada range [first, last), artinya dari elemen yang ditunjuk first sampai tepat sebelum last.

Kategori Algoritma Utama dan Implementasinya

Mari kita eksplorasi algoritma-algoritma paling berguna yang akan sering kamu gunakan. Jangan lupa untuk include header <algorithm>!

1. Algoritma Pencarian (Searching Algorithms)

a. std::find – Mencari Elemen Spesifik

Mencari elemen pertama yang nilainya sama dengan value yang dicari. Mengembalikan iterator ke elemen tersebut, atau .end() jika tidak ditemukan.

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> numbers = {10, 20, 30, 40, 50};

    // Cari angka 30
    auto it = std::find(numbers.begin(), numbers.end(), 30);

    if (it != numbers.end()) {
        std::cout << "Ditemukan: " < < *it << std::endl; // Output: Ditemukan: 30
        std::cout << "Pada index: " << std::distance(numbers.begin(), it) << std::endl; // Output: Pada index: 2
    } else {
        std::cout << "Tidak ditemukan" << std::endl;
    }

    return 0;
}

b. std::count – Menghitung Kemunculan Elemen

Menghitung berapa kali sebuah nilai muncul dalam range.

std::vector<int> scores = {85, 90, 78, 90, 92, 85, 90};
int count90 = std::count(scores.begin(), scores.end(), 90);
std::cout << "Nilai 90 muncul " << count90 << " kali." << std::endl; // Output: Nilai 90 muncul 3 kali.

2. Algoritma Pengurutan dan Pembandingan (Sorting & Comparison)

a. std::sort – Mengurutkan dengan Cepat

Mengurutkan elemen dalam container secara ascending (dari kecil ke besar) secara default. Menggunakan algoritma yang sangat efisien (biasanya Introsort).

std::vector<int> ages = {23, 17, 35, 42, 19};
std::sort(ages.begin(), ages.end()); // Mengurutkan seluruh vector

// ages sekarang menjadi: {17, 19, 23, 35, 42}

// Mengurutkan descending (dari besar ke kecil)
std::sort(ages.begin(), ages.end(), std::greater<int>());
// ages sekarang: {42, 35, 23, 19, 17}

b. std::reverse – Membalikkan Urutan

Membalikkan urutan elemen dalam range.

std::vector<char> letters = {'a', 'b', 'c', 'd'};
std::reverse(letters.begin(), letters.end());
// letters sekarang: {'d', 'c', 'b', 'a'}

3. Algoritma Modifikasi (Modifying Algorithms)

a. std::copy – Menyalin Range

Menyalin elemen dari source range ke destination range.

std::vector<int> source = {1, 2, 3, 4, 5};
std::vector<int> destination(5); // Vector dengan 5 elemen

std::copy(source.begin(), source.end(), destination.begin());
// destination sekarang: {1, 2, 3, 4, 5}

b. std::fill – Mengisi Range dengan Nilai Sama

Mengisi semua elemen dalam range dengan nilai tertentu.

std::vector<int> data(10); // Vector dengan 10 elemen (default 0)
std::fill(data.begin(), data.end(), -1);
// data sekarang: {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}

4. Algoritma Numerik (Numeric Algorithms)

Untuk algoritma ini, include header <numeric>.

a. std::accumulate – Menjumlahkan Semua Elemen

Mengakumulasi nilai semua elemen dalam range. Default-nya adalah penjumlahan, tapi bisa diubah dengan operasi lain.

#include <numeric>

std::vector<int> numbers = {1, 2, 3, 4, 5};
int sum = std::accumulate(numbers.begin(), numbers.end(), 0); // 0 adalah nilai awal
std::cout << "Jumlah: " << sum << std::endl; // Output: Jumlah: 15

// Bisa juga untuk perkalian
int product = std::accumulate(numbers.begin(), numbers.end(), 1, std::multiplies<int>());
std::cout << "Hasil kali: " << product << std::endl; // Output: Hasil kali: 120

Kekuatan Sebenarnya: Lambda Expressions dengan Algorithms

Ini dia bagian yang paling keren! Kamu bisa membuat algoritma generik STL menjadi sangat spesifik dengan menggunakan lambda expressions (fungsi anonymous).

Contoh 1: Mengurutkan berdasarkan kriteria kustom
Misalnya kita punya vector of pairs (nama, nilai) dan ingin mengurutkannya berdasarkan nilai (descending).

std::vector<std::pair<std::string, int>> students = {{"Alice", 85}, {"Bob", 92}, {"Charlie", 78}};

// Urutkan berdasarkan nilai (second element of pair) dari tinggi ke rendah
std::sort(students.begin(), students.end(),
    [](const auto& a, const auto& b) {
        return a.second > b.second; // Kriteria sorting kustom
    });

// Sekarang urutannya: Bob(92), Alice(85), Charlie(78)

Contoh 2: std::find_if – Mencari dengan Kondisi Kustom
Mencari elemen pertama yang memenuhi suatu kondisi.

std::vector<int> numbers = {15, 25, 35, 45, 55};

// Cari angka pertama yang lebih besar dari 30
auto it = std::find_if(numbers.begin(), numbers.end(),
    [](int n) {
        return n > 30;
    });

if (it != numbers.end()) {
    std::cout << "Ditemukan: " << *it << std::endl; // Output: Ditemukan: 35
}

Tabel Cepat: Algoritma-Algoritma Penting Lainnya

Nama Algoritma Fungsi Contoh Penggunaan
std::max_element Mencari elemen terbesar auto maxIt = std::max_element(v.begin(), v.end());
std::min_element Mencari elemen terkecil auto minIt = std::min_element(v.begin(), v.end());
std::remove_if Menghapus elemen yang memenuhi kondisi v.erase(std::remove_if(v.begin(), v.end(), [](int x){return x%2==0;}), v.end());
std::transform Memproses setiap elemen std::transform(v.begin(), v.end(), v.begin(), [](int x){return x*2;});

Kesimpulan: Jangan Menulis Kode yang Sudah Ditulis Orang Lain!

Menguasai C++ Algorithms adalah lompatan kualitas yang besar bagi seorang programmer C++. Daripada terjebak menulis loop yang sama berulang-ulang, kamu sekarang punya akses ke kotak perkakas yang penuh dengan solusi elegan dan efisien.

Kunci untuk mahir adalah dengan berlatih. Cobalah untuk mengganti loop-loop manual dalam kode kamu dengan algoritma STL yang sesuai. Mulailah dari yang sederhana seperti std::find dan std::sort, lalu perlahan eksplorasi yang lebih advanced dengan lambda expressions.

Ingatlah pepatah dalam programming: “Don’t reinvent the wheel.” Dengan STL Algorithms, kamu tidak perlu membuat roda sendiri—kamu sudah punya set roda balap yang siap dipakai. Selamat mengeksplorasi!