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++:
| Standar | Tahun | Sorotan Fitur |
|---|---|---|
| C++98 | 1998 | Standar pertama, templates, STL |
| C++03 | 2003 | Perbaikan bug, kompatibilitas |
| C++11 | 2011 | auto, lambda, smart pointer, range-based for |
| C++14 | 2014 | Generic lambda, binary literals |
| C++17 | 2017 | Structured bindings, std::optional, std::filesystem |
| C++20 | 2020 | Concepts, ranges, coroutines, modules |
| C++23 | 2023 | std::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
automembebaskan kita menulis tipe panjang sepertistd::vector<int>::const_iterator. - Range-based for loop: iterasi container secara ringkas.
- Smart pointer:
std::unique_ptrdanstd::shared_ptrmengelola 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:
g++ -std=c++17 -O2 -Wall -Wextra -o program program.cppPenjelasan flag di atas:
| Flag | Kegunaan |
|---|---|
-std=c++17 | Memakai standar C++17 |
-O2 | Optimasi level 2, menghasilkan binary lebih cepat |
-Wall -Wextra | Mengaktifkan peringatan compiler, membantu deteksi bug |
-o program | Nama 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 #
#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:
Nama : Budi
Nilai: 85 92 78 90
Budi berumur 17 tahun
Siti berumur 18 tahunBedah Kode Baris-per-Baris #
Mari kita telaah bagian-bagian penting dari program di atas:
- Baris 1–4 (
#include): menyertakan header untuk I/O (<iostream>),std::vector(<vector>),std::string(<string>), danstd::map(<map>). C++ tidak mengimpor header otomatis seperti beberapa bahasa lain. - Baris 7 (
auto nama = std::string("Budi");): kata kunciautomeminta compiler mendeduksi tipe dari sisi kanan. Compiler akan menyimpulkannamabertipestd::string. - 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). - Baris 12 (
for (int n : nilai)): range-based for loop yang menjelajah tiap elemennilai. Setiap elemen disalin ke variabelnbertipeint. - Baris 19–20 (
umur["Budi"] = 17;): mengaksesstd::maplewatoperator[]membuat entri baru jika kunci belum ada. - Baris 23 (
for (const auto& [kunci, isi] : umur)): structured bindings (C++17). Setiap elemenumurberupastd::pair<const std::string, int>. Structured bindings membongkar pasangan tersebut menjadi variabelkuncidanisisecara 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 -Wextramenjadi 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.