Standard library adalah teman kerja terdekat kita sepanjang course ini: dari std::vector pada section awal hingga std::expected dan std::jthread pada section lanjutan, semuanya punya satu rujukan yang sama. Chapter sebelumnya memetakan dokumen resmi secara luas; chapter ini mempersempit fokus ke satu situs — cppreference.com — dan mengurutkannya menjadi lima kategori besar. Setelah chapter ini, kita tahu persis halaman mana yang perlu dibuka ketika sedang memilih container, memanggil algorithm, atau menyelidiki perilaku I/O.

Lima Kategori Besar di cppreference #

Halaman header adalah indeks seluruh header standar dan titik mulai terbaik saat kita belum hafal namanya. Dari sana, isi library membelah ke lima kategori besar berikut:

  • Containers — daftar std::vector, std::map, std::unordered_map, dan kawan-kawan, lengkap dengan tabel kecepatan setiap operasi; tabel ini paling berguna saat kita memilih struktur data.
  • Algorithms — std::sort, std::find, std::transform, dan seluruh <ranges>; membaca daftar ini sesekali membuat kita berhenti menulis loop manual tanpa perlu.
  • Utilities — std::optional, std::expected, std::tuple, std::move, dan pembanding; kategori “serba ada” yang sering menyelamatkan desain API.
  • Input/Output — std::iostream, manipulator, dan aliran berkas; halaman ini kita buka saat format angka atau penanganan error I/O membingungkan.
  • Concurrency — std::thread, std::mutex, std::atomic, dan std::jthread; dibaca bersama section Concurrency course ini.

Halaman yang Kita Pakai Sepanjang Course #

Beberapa header muncul begitu sering hingga patut dihafal path-nya: <iostream> dan <print> untuk keluaran, <string> dan <vector> sebagai tipe data bawaan pilihan, <algorithm> untuk pemrosesan, <map> dan <unordered_map> untuk pencarian cepat, lalu <optional>, <expected>, dan <format> dari generasi C++ modern. Kebiasaan yang efektif: buka halaman header, bukan hanya halaman fungsinya. Halaman header menampilkan seluruh isi dalam satu pandangan, sehingga kita menemukan fungsi bantu yang tidak pernah terlintas — misalnya std::rotate yang tersembunyi di dalam <algorithm>.

Habit Membaca Complexity dan Requirements #

Dua bagian halaman yang wajib dibaca sebelum memakai apa pun adalah Complexity dan Requirements. Bagian Complexity menyatakan biaya operasi dengan notasi Big-O — std::vector::push_back amortized O(1), sedangkan std::map::insert O(log n); angka ini menentukan pilihan container pada jalur kode yang panas. Bagian Requirements menyatakan syarat yang harus dipenuhi tipe kita, misalnya harus CopyAssignable atau Comparable; jika syarat ini dilanggar, error compiler yang muncul akan sangat panjang, dan tahu requirement-nya sejak awal membuat pesan error itu mudah dipahami. Sisipkan juga kebiasaan memeriksa badge since C++xx di setiap deklarasi, agar kita tidak meniru fitur yang belum didukung compiler teman kerja.

Peta Header dalam Program #

Untuk mengubah peta di atas menjadi ceklis yang tercetak, program berikut menyusun lima kategori beserta contoh header-nya. Perhatikan bahwa urutan keluaran tidak mengikuti urutan penulisan — itulah sifat std::map yang menjaga kunci terurut:

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

// Satu header standar beserta path halamannya di cppreference.
struct Header {
    std::string nama;
    std::string halaman;
};

int main() {
    // std::map menjaga kunci (kategori) tetap terurut otomatis.
    std::map<std::string, std::vector<Header>> peta = {
        {"Algoritma",  {{"<algorithm>", "w/cpp/header/algorithm"},
                        {"<ranges>",    "w/cpp/header/ranges"},
                        {"<numeric>",   "w/cpp/header/numeric"}}},
        {"Concurrency",{{"<atomic>",    "w/cpp/header/atomic"},
                        {"<mutex>",     "w/cpp/header/mutex"},
                        {"<thread>",    "w/cpp/header/thread"}}},
        {"Container",  {{"<string>",        "w/cpp/header/string"},
                        {"<unordered_map>", "w/cpp/header/unordered_map"},
                        {"<vector>",        "w/cpp/header/vector"}}},
        {"I/O",        {{"<fstream>",   "w/cpp/header/fstream"},
                        {"<iostream>",  "w/cpp/header/iostream"},
                        {"<print>",     "w/cpp/header/print"}}},
        {"Utilities",  {{"<expected>",  "w/cpp/header/expected"},
                        {"<optional>",  "w/cpp/header/optional"},
                        {"<utility>",   "w/cpp/header/utility"}}},
    };

    int total = 0;
    for (const auto& [kategori, daftar] : peta) {
        std::cout << kategori << " (" << daftar.size() << " header)\n";
        for (const Header& h : daftar) {
            std::cout << "  " << h.nama << " -> en.cppreference.com/" << h.halaman << "\n";
            ++total;
        }
    }
    std::cout << "Total header terkurasi: " << total << "\n";
    return 0;
}

Output yang Dihasilkan:

text
Algoritma (3 header)
  <algorithm> -> en.cppreference.com/w/cpp/header/algorithm
  <ranges> -> en.cppreference.com/w/cpp/header/ranges
  <numeric> -> en.cppreference.com/w/cpp/header/numeric
Concurrency (3 header)
  <atomic> -> en.cppreference.com/w/cpp/header/atomic
  <mutex> -> en.cppreference.com/w/cpp/header/mutex
  <thread> -> en.cppreference.com/w/cpp/header/thread
Container (3 header)
  <string> -> en.cppreference.com/w/cpp/header/string
  <unordered_map> -> en.cppreference.com/w/cpp/header/unordered_map
  <vector> -> en.cppreference.com/w/cpp/header/vector
I/O (3 header)
  <fstream> -> en.cppreference.com/w/cpp/header/fstream
  <iostream> -> en.cppreference.com/w/cpp/header/iostream
  <print> -> en.cppreference.com/w/cpp/header/print
Utilities (3 header)
  <expected> -> en.cppreference.com/w/cpp/header/expected
  <optional> -> en.cppreference.com/w/cpp/header/optional
  <utility> -> en.cppreference.com/w/cpp/header/utility
Total header terkurasi: 15

Bedah program di atas:

  1. std::map<std::string, std::vector<Header>>: kunci string diurutkan otomatis oleh map, sehingga kategori tercetak alfabetis tanpa usaha tambahan — keputusan struktur data justru mengurus pemformatan.
  2. Structured binding const auto& [kategori, daftar]: memecah setiap entri map menjadi kunci dan nilai tanpa menyebut first dan second.
  3. daftar.size(): menghitung header per kategori secara dinamis; menambah entri baru tidak butuh pembaruan apa pun.
  4. Penghitung total: sengaja dikelola manual karena tidak tersedia dari map; penjumlahan kecil semacam ini nanti bisa digantikan std::accumulate dari <numeric>.

Dokumentasi memberi jawaban atas pertanyaan “apa dan bagaimana”, tetapi jarang menjelaskan “mengapa desainnya seperti ini”. Untuk lapisan pemahaman itu, kita berpindah ke sumber kedua yang telah mendampingi pemrogram C++ selama puluhan tahun: buku. Chapter berikutnya memilihkan buku klasik mana yang cocok untuk tahap belajar kita.