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 #
#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:
s = halo dunia
t = *****
size = 10
s[0] = h- Baris
std::string s = "halo dunia";: konstruksi dari literal.smengelola buffer sendiri yang berisi karakter tersebut plus null terminator. - Baris
std::string t(5, '*');: konstruktor fill — buat string dengan 5 karakter'*'. - Baris
s.size(): panjang string dalam karakter. Untuk"halo dunia"panjangnya10(spasi dihitung). - Baris
s[0]: akses karakter pertama.s[0]tidak melakukan bounds checking; gunakans.at(0)bila butuh pengecekan (melemparstd::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:
| Operasi | Sintaks | Catatan |
|---|---|---|
| Substring | s.substr(pos, len) | Mengembalikan string baru |
| Mencari pola | s.find("abc") | Mengembalikan posisi atau std::string::npos |
| Mencari dari belakang | s.rfind("abc") | Pencarian terakhir |
| Menggabungkan | s + t atau s.append(t) | Mengembalikan string baru |
| Membandingkan | s < t, s == t | Lexicographic |
| Menghapus | s.erase(pos, len) | Modifikasi in-place |
| Sisip | s.insert(pos, "x") | Modifikasi in-place |
Kode: Operasi Lengkap #
#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:
substr = halo
find pos = 5
gabung = halo dunia!
a < b = true- Baris
s.substr(0, 4): mengambil 4 karakter mulai indeks0→"halo". Bila argumen kedua dihilangkan, diambil sampai akhir. - Baris
s.find("dunia"): mencari pola"dunia". Mengembalikan indeks awal kemunculan (5) ataustd::string::nposbila tidak ditemukan. - Baris
s + "!": operator+mengembalikan string baru hasil penggabungan. Untuk modifikasi in-place, gunakans += "!". - 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 #
#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:
vokal = 5- Baris
for (char c : s): untuk setiap karakter dalams, ikat kec. Karenacharkecil, copy tidak masalah. - 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 #
#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:
prefix = halo
prefix = dun- Baris
void cetak_prefix(std::string_view sv, ...): parameter menerima string dari berbagai sumber —std::string, literal, ataustring_viewlain — tanpa copy mahal. - Baris
cetak_prefix(s, 4):std::stringotomatis dikonversi menjadistring_viewyang menunjuk buffer internals. - Baris
cetak_prefix("dunia", 3): literal string juga langsung menjadistring_view. Buffer literal berada di segmen read-only program.
Operasi Lanjutan untuk DSA #
Beberapa operasi khusus sering muncul di soal DSA:
| Kebutuhan | Pendekatan |
|---|---|
| Tokenisasi (split by delimiter) | std::istringstream atau loop manual find + substr |
| Reverse string | std::reverse(s.begin(), s.end()) |
| Sorting karakter | std::sort(s.begin(), s.end()) |
Konversi int ke string | std::to_string(42) |
Konversi string ke int | std::stoi(s) (lempar std::invalid_argument bila gagal) |
| Trim whitespace | Loop manual atau find_first_not_of / find_last_not_of |
Ringkasan #
std::stringadalah container dinamis yang mengelola memorinya sendiri; akses karakter via[]atauat().- Operasi umum:
substr,find,+, perbandingan lexicographic, dan iterasi range-based. s.find()mengembalikanstd::string::nposbila tidak ketemu — selalu cek eksplisit.std::string_viewadalah view baca-saja tanpa copy; ideal untuk parameter fungsi yang menerima berbagai sumber string.- Waspadai dangling view: sumber harus hidup lebih lama daripada
string_viewyang menunjuknya.