Banyak soal DSA berbasis teks: pencarian pola, manipulasi token, pemrosesan bioinformatika. C++ menyediakan std::string sebagai tipe string modern yang mengelola memorinya sendiri, dan std::string_view (sejak C++17) sebagai jendela baca-saja yang efisien tanpa copy. Pada Chapter ini kita akan mempelajari operasi std::string yang paling sering dipakai di soal DSA, lalu memahami kapan memakai string_view untuk efisiensi.

Konstruksi dan Akses #

std::string adalah container yang menyimpan deretan char. Kita dapat membuatnya dari literal string, mengulang karakter tertentu, atau meng-copy string lain. Akses karakter memakai operator[] atau at().

Mekanisme: String Sebagai Container #

std::string sebenarnya adalah std::basic_string<char> — container berurutan seperti std::vector dengan tambahan operasi khusus string. Memory dialokasikan secara dinamis dan otomatis dibebaskan saat string keluar scope.

Kode: Konstruksi dan Akses Dasar #

cpp
#include <iostream>
#include <string>

int main() {
    std::string s = "halo dunia";
    std::string t(5, '*');          // lima karakter '*'

    std::cout << "s     = " << s << '\n';
    std::cout << "t     = " << t << '\n';
    std::cout << "size  = " << s.size() << '\n';
    std::cout << "s[0]  = " << s[0] << '\n';
    return 0;
}

Output yang Dihasilkan:

text
s     = halo dunia
t     = *****
size  = 10
s[0]  = h
  1. Baris std::string s = "halo dunia";: konstruksi dari literal. s mengelola buffer sendiri yang berisi karakter tersebut plus null terminator.
  2. Baris std::string t(5, '*');: konstruktor fill — buat string dengan 5 karakter '*'.
  3. Baris s.size(): panjang string dalam karakter. Untuk "halo dunia" panjangnya 10 (spasi dihitung).
  4. Baris s[0]: akses karakter pertama. s[0] tidak melakukan bounds checking; gunakan s.at(0) bila butuh pengecekan (melempar std::out_of_range).

Operasi Umum #

Soal DSA string sering memerlukan operasi: mengambil substring, mencari pola, menggabungkan, dan membandingkan. Tabel berikut merangkum yang paling sering dipakai:

OperasiSintaksCatatan
Substrings.substr(pos, len)Mengembalikan string baru
Mencari polas.find("abc")Mengembalikan posisi atau std::string::npos
Mencari dari belakangs.rfind("abc")Pencarian terakhir
Menggabungkans + t atau s.append(t)Mengembalikan string baru
Membandingkans < t, s == tLexicographic
Menghapuss.erase(pos, len)Modifikasi in-place
Sisips.insert(pos, "x")Modifikasi in-place

Kode: Operasi Lengkap #

cpp
#include <iostream>
#include <string>

int main() {
    std::string s = "halo dunia";

    std::string sub = s.substr(0, 4);          // "halo"
    std::size_t pos = s.find("dunia");          // cari posisi
    std::cout << "substr   = " << sub << '\n';
    std::cout << "find pos = " << pos << '\n';

    std::string gabung = s + "!";
    std::cout << "gabung   = " << gabung << '\n';

    std::string a = "apple";
    std::string b = "apricot";
    std::cout << "a < b    = " << std::boolalpha << (a < b) << '\n';
    return 0;
}

Output yang Dihasilkan:

text
substr   = halo
find pos = 5
gabung   = halo dunia!
a < b    = true
  1. Baris s.substr(0, 4): mengambil 4 karakter mulai indeks 0 → "halo". Bila argumen kedua dihilangkan, diambil sampai akhir.
  2. Baris s.find("dunia"): mencari pola "dunia". Mengembalikan indeks awal kemunculan (5) atau std::string::npos bila tidak ditemukan.
  3. Baris s + "!": operator + mengembalikan string baru hasil penggabungan. Untuk modifikasi in-place, gunakan s += "!".
  4. Baris a < b: perbandingan lexicographic karakter per karakter. "apple" < "apricot" karena karakter kedua 'p' lebih kecil dari 'r'.

Iterasi Karakter #

Banyak algoritma string memproses karakter satu per satu: hitung vokal, balik string, atau ubah case. std::string mendukung range-based for seperti container STL lain.

Kode: Menghitung Vokal #

cpp
#include <iostream>
#include <string>

int main() {
    std::string s = "halo dunia";
    int vokal = 0;
    for (char c : s) {
        if (c == 'a' || c == 'i' || c == 'u' || c == 'e' || c == 'o') {
            ++vokal;
        }
    }
    std::cout << "vokal = " << vokal << '\n';
    return 0;
}

Output yang Dihasilkan:

text
vokal = 5
  1. Baris for (char c : s): untuk setiap karakter dalam s, ikat ke c. Karena char kecil, copy tidak masalah.
  2. Pengecekan vokal: perbandingan langsung dengan literal 'a', 'i', dst. Untuk dukungan unicode atau case-insensitive, dibutuhkan pendekatan lebih kompleks.

std::string_view untuk Efisiensi #

std::string_view (sejak C++17) adalah non-owning reference ke urutan karakter. Membuat string_view dari std::string atau literal string tidak menyalin data — hanya menyimpan pointer dan panjang.

Mekanisme: View vs Copy #

Saat kita melewatkan std::string by value, terjadi copy buffer. Dengan std::string_view, kita hanya menyalin pointer dan panjang (16 byte total di sistem 64-bit). Operasi substr pada string_view juga tidak menyalin — hanya menggeser pointer dan memperbarui panjang.

Kode: View sebagai Parameter Fungsi #

cpp
#include <iostream>
#include <string>
#include <string_view>

void cetak_prefix(std::string_view sv, std::size_t n) {
    if (n <= sv.size()) {
        std::cout << "prefix = " << sv.substr(0, n) << '\n';
    } else {
        std::cout << "prefix = " << sv << '\n';
    }
}

int main() {
    std::string s = "halo dunia";
    cetak_prefix(s, 4);          // dari std::string
    cetak_prefix("dunia", 3);     // dari literal
    return 0;
}

Output yang Dihasilkan:

text
prefix = halo
prefix = dun
  1. Baris void cetak_prefix(std::string_view sv, ...): parameter menerima string dari berbagai sumber — std::string, literal, atau string_view lain — tanpa copy mahal.
  2. Baris cetak_prefix(s, 4): std::string otomatis dikonversi menjadi string_view yang menunjuk buffer internal s.
  3. Baris cetak_prefix("dunia", 3): literal string juga langsung menjadi string_view. Buffer literal berada di segmen read-only program.

Operasi Lanjutan untuk DSA #

Beberapa operasi khusus sering muncul di soal DSA:

KebutuhanPendekatan
Tokenisasi (split by delimiter)std::istringstream atau loop manual find + substr
Reverse stringstd::reverse(s.begin(), s.end())
Sorting karakterstd::sort(s.begin(), s.end())
Konversi int ke stringstd::to_string(42)
Konversi string ke intstd::stoi(s) (lempar std::invalid_argument bila gagal)
Trim whitespaceLoop manual atau find_first_not_of / find_last_not_of

Ringkasan #

  • std::string adalah container dinamis yang mengelola memorinya sendiri; akses karakter via [] atau at().
  • Operasi umum: substr, find, +, perbandingan lexicographic, dan iterasi range-based.
  • s.find() mengembalikan std::string::npos bila tidak ketemu — selalu cek eksplisit.
  • std::string_view adalah view baca-saja tanpa copy; ideal untuk parameter fungsi yang menerima berbagai sumber string.
  • Waspadai dangling view: sumber harus hidup lebih lama daripada string_view yang menunjuknya.