Membandingkan Vec dengan Box di Rust
Latihan membuat instruksi pembelajaran yang terkait penggunaan tipe data Vec dan Box yang lebih cocok untuk implementasi ADT di bahasa pemrograman Rust.
Tujuan Pembelajaran
Setelah mempelajari materi ini, pembaca diharapkan mampu:
Menjelaskan perbedaan antara
Vec<T>
danBox<T>
dari sisi struktur memori.Memahami peran
Vec
sebagai koleksi dinamis danBox
sebagai pembungkus nilai tunggal di heap.Menentukan kapan menggunakan
Vec
atauBox
dalam kasus praktis.Menghubungkan penggunaan
Vec
danBox
dengan pembahasan ADT (misalnya List atau LinkedList).Mengantisipasi potensi kesalahan umum (edge cases) saat bekerja dengan keduanya.
Prasyarat
Sebelum mempelajari materi ini, pembaca sebaiknya sudah:
Mengenal dasar bahasa Rust: variabel, fungsi, tipe data.
Memahami konsep stack dan heap.
Membaca artikel sebelumnya tentang Membandingkan Array dengan Vec.
Konsep Dasar
Mengingat Kembali Vec<T>
Vec<T>
adalah koleksi dinamis untuk menyimpan banyak elemen dengan tipe sama.Disimpan di stack sebagai struktur tiga word (pointer ke heap, panjang, kapasitas).
Elemen-elemen tersimpan di heap secara kontigu.
Dapat bertambah atau berkurang ukurannya sesuai kebutuhan.
fn main() {
let mut v: Vec<i32> = Vec::new();
v.push(10);
v.push(20);
println!("{:?}", v); // [10, 20]
}
Mengingat Kembali Box<T>
Box<T>
sudah pernah dibahas singkat sebelumnya ketika membandingkan array dengan Vec.Box<T>
adalah smart pointer sederhana yang menyimpan satu nilai di heap.Berguna ketika:
Data terlalu besar untuk stack.
Hanya ingin satu alokasi di heap.
Membuat struktur rekursif (contoh: LinkedList, Tree).
fn main() {
let b: Box<i32> = Box::new(42);
println!("{}", b); // 42
}
Kapan Menggunakan Vec
vs Box
Gunakan
Vec<T>
bila:Perlu menyimpan banyak elemen dengan tipe sama.
Ukuran koleksi berubah-ubah (dynamic size).
Perlu akses cepat ke elemen melalui indeks.
Gunakan
Box<T>
bila:Hanya menyimpan satu nilai besar di heap.
Ingin menghindari penyalinan data besar ke stack.
Membutuhkan pointer tunggal untuk tipe rekursif.
Kaitan dengan ADT dan Struktur Data
Pembahasan Vec
dan Box
menjadi lebih penting ketika kita masuk ke ADT (Abstract Data Type) seperti List, Stack, Queue, atau LinkedList.
Vec<T>
sering menjadi implementasi praktis untuk ADT List karena mendukung operasi dinamis sepertipush
,pop
, dan indexing cepat.Box<T>
lebih relevan saat membuat struktur data rekursif, misalnya:Linked List di mana setiap node menunjuk ke node berikutnya dengan
Box
.Tree di mana setiap node punya anak berupa
Box<Node>
.
Dengan kata lain: Vec
adalah solusi praktis, sementara Box
membuka jalan untuk memahami bagaimana struktur data dibangun di atas konsep pointer dan heap.
Edge Cases
Kesalahan Umum dengan
Box
Mengira
Box
bisa menampung koleksi elemen sepertiVec
. Padahal hanya satu nilai.
Reallocation di
Vec
Saat kapasitas penuh,
Vec
melakukan reallocation dan menyalin semua elemen ke lokasi heap baru.Hal ini membuat pointer lama tidak valid, sehingga borrow checker Rust sangat penting.
Ownership
Box
fn main() { let b = Box::new(5); let c = b; // ownership pindah ke c // println!("{}", b); // error: b tidak lagi valid println!("{}", c); }
Refleksi
Mengapa
Vec
lebih cocok untuk menyimpan banyak data yang sering berubah ukurannya?Mengapa
Box
sering dipakai untuk membuat LinkedList?Bagaimana kesalahan memilih antara
Vec
danBox
dapat berdampak pada performa atau keterbacaan kode?
Clue: pikirkan perbedaan jumlah data (banyak vs tunggal), sifat dinamis Vec
vs sifat sederhana Box
, serta kebutuhan struktur data yang rekursif.
Referensi
Rust Documentation: The Rust Programming Language (The Book). Tersedia di: https://doc.rust-lang.org/book/
Rust Standard Library:
Vec
danBox
. Tersedia di: https://doc.rust-lang.org/std/Sekolah Teknik Elektro dan Informatika, Institut Teknologi Bandung. Praktikum Algoritma dan Struktur Data.