Banyak algoritma klasik dan struktur data modern ditulis dan dioptimalkan dalam C++. Bahasa ini memberi kontrol langsung terhadap memori sekaligus menyediakan abstraksi tingkat tinggi yang membuat kode tetap rapi. Pada Course ini, C++ akan menjadi bahasa utama yang kita pakai untuk mengimplementasikan setiap konsep DSA. Pada Chapter pengenalan ini kita akan melihat sejarah singkat C++, mengapa C++ cocok untuk DSA, dan menulis program pertama yang memakai beberapa fitur modern C++17.

Sejarah Singkat C++ #

C++ lahir pada awal 1980-an di Bell Labs sebagai pengembangan bahasa C oleh Bjarne Stroustrup. Stroustrup menambahkan konsep object-oriented programming dan generic programming ke C dengan tetap mempertahankan efisiensi dan kontrol memori tingkat rendah. Nama “C++” sendiri muncul tahun 1983, mengikuti notasi increment pada C (++).

Garis waktu perkembangan standar C++:

StandarTahunSorotan Fitur
C++981998Standar pertama, templates, STL
C++032003Perbaikan bug, kompatibilitas
C++112011auto, lambda, smart pointer, range-based for
C++142014Generic lambda, binary literals
C++172017Structured bindings, std::optional, std::filesystem
C++202020Concepts, ranges, coroutines, modules
C++232023std::print, deducing this, perbaikan ranges

Course ini memakai C++17 sebagai standar minimum, dengan beberapa fitur C++20 yang ditandai khusus ketika dipakai. C++17 dipilih karena didukung stabil oleh mayoritas compiler modern dan berisi fitur yang sangat berguna untuk DSA.

Mengapa C++ untuk DSA #

Beberapa alasan kuat memilih C++ sebagai bahasa utama Course DSA:

  • Performa tinggi: C++ dikompilasi ke native code sehingga eksekusinya cepat. Ini penting saat kita ingin mengukur kinerja algoritma secara realistis.
  • Standard Template Library (STL): kaya struktur data siap pakai seperti std::vector, std::map, std::set, std::unordered_map, std::priority_queue.
  • Kontrol memori eksplisit: pointer, reference, dan smart pointer memberi pemahaman mendalam tentang bagaimana struktur data bekerja di memori.
  • Ekosistem kompetisi: competitive programming internasional (Codeforces, IOI, ICPC) memakai C++ sebagai bahasa de facto, sehingga banyak referensi tersedia.
  • Multi-paradigma: mendukung procedural, object-oriented, dan generic programming, fleksibel untuk berbagai gaya penyelesaian masalah.

Karakteristik C++ Modern #

C++ modern (sejak C++11) memiliki beberapa karakteristik yang membuatnya lebih ergonomis dibanding C++ klasik:

  • Type inference: kata kunci auto membebaskan kita menulis tipe panjang seperti std::vector<int>::const_iterator.
  • Range-based for loop: iterasi container secara ringkas.
  • Smart pointer: std::unique_ptr dan std::shared_ptr mengelola memori otomatis melalui RAII.
  • Lambda expression: fungsi anonim yang dapat ditulis inline.
  • Structured bindings: membongkar std::pair, std::tuple, dan aggregate dengan mudah (C++17).
  • Move semantics: menghindari penyalinan mahal dengan memindahkan resource.

Fitur-fitur ini akan kita pakai sepanjang Course. Untuk saat ini, kita akan melihat contoh sederhana yang memakai beberapa di antaranya.

Standar C++ yang Dipakai #

Course ini memakai C++17 sebagai standar default. Saat mengompilasi, kita akan selalu menyertakan flag -std=c++17:

bash
g++ -std=c++17 -O2 -Wall -Wextra -o program program.cpp

Penjelasan flag di atas:

FlagKegunaan
-std=c++17Memakai standar C++17
-O2Optimasi level 2, menghasilkan binary lebih cepat
-Wall -WextraMengaktifkan peringatan compiler, membantu deteksi bug
-o programNama file output binary

Program Pertama: Memakai Fitur Modern C++ #

Sebelum membahas instalasi compiler pada Chapter berikutnya, mari kita lihat program C++ yang memakai beberapa fitur modern. Kode ini bukan sekadar “Hello World”; kode ini memperlihatkan auto, range-based for loop, std::map, dan structured bindings (C++17) dalam satu program yang ringkas.

Mekanisme Kerja #

Program menyimpan nama seseorang dan daftar nilainya, lalu menyimpan pasangan nama-umur di std::map. Iterasi pada std::vector memakai range-based for loop. Iterasi pada std::map memakai structured bindings untuk membongkar key dan value ke variabel terpisah dalam satu baris.

Kode Program #

cpp
#include <iostream>
#include <vector>
#include <string>
#include <map>

int main() {
    // Tipe modern: auto dan uniform initialization
    auto nama   = std::string("Budi");
    auto nilai  = std::vector<int>{85, 92, 78, 90};

    // Range-based for loop
    std::cout << "Nama : " << nama << "\n";
    std::cout << "Nilai: ";
    for (int n : nilai) {
        std::cout << n << " ";
    }
    std::cout << "\n";

    // Menggunakan std::map untuk menyimpan pasangan key-value
    std::map<std::string, int> umur;
    umur["Budi"] = 17;
    umur["Siti"] = 18;

    // Structured bindings (C++17)
    for (const auto& [kunci, isi] : umur) {
        std::cout << kunci << " berumur " << isi << " tahun\n";
    }

    return 0;
}

Output yang Dihasilkan:

text
Nama : Budi
Nilai: 85 92 78 90 
Budi berumur 17 tahun
Siti berumur 18 tahun

Bedah Kode Baris-per-Baris #

Mari kita telaah bagian-bagian penting dari program di atas:

  1. Baris 1–4 (#include): menyertakan header untuk I/O (<iostream>), std::vector (<vector>), std::string (<string>), dan std::map (<map>). C++ tidak mengimpor header otomatis seperti beberapa bahasa lain.
  2. Baris 7 (auto nama = std::string("Budi");): kata kunci auto meminta compiler mendeduksi tipe dari sisi kanan. Compiler akan menyimpulkan nama bertipe std::string.
  3. Baris 8 (auto nilai = std::vector<int>{85, 92, 78, 90};): uniform initialization dengan kurung kurawal {}. Sintaks ini aman dari narrowing conversion (mis. int{3.14} akan error).
  4. Baris 12 (for (int n : nilai)): range-based for loop yang menjelajah tiap elemen nilai. Setiap elemen disalin ke variabel n bertipe int.
  5. Baris 19–20 (umur["Budi"] = 17;): mengakses std::map lewat operator[] membuat entri baru jika kunci belum ada.
  6. Baris 23 (for (const auto& [kunci, isi] : umur)): structured bindings (C++17). Setiap elemen umur berupa std::pair<const std::string, int>. Structured bindings membongkar pasangan tersebut menjadi variabel kunci dan isi secara langsung. const auto& menghindari penyalinan elemen map yang relatif mahal.

Struktur Umum Program C++ #

Program C++ umumnya terdiri dari beberapa bagian:

Preprocessor directive #include menyertakan header. Fungsi main() adalah titik masuk eksekusi; sistem operasi memanggil main() ketika program dijalankan. Nilai kembalian 0 menandakan eksekusi sukses tanpa error; nilai bukan nol biasanya menandakan kegagalan.

Ringkasan #

Pada Chapter ini kita telah memperkenalkan C++ sebagai bahasa utama Course:

  • Sejarah: C++ berkembang dari C dengan menambahkan OOP dan generic programming.
  • Standar: Course memakai C++17 dengan beberapa fitur C++20 bila perlu.
  • Fitur modern: auto, range-based for, structured bindings, smart pointer, lambda.
  • Pipeline kompilasi: flag -std=c++17 -O2 -Wall -Wextra menjadi standar kita.

Pada Chapter berikutnya kita akan menginstal compiler C++ (GCC, Clang, atau MSVC) pada sistem operasi yang dipakai agar kita dapat mulai menulis dan menguji kode.