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
Vecsebagai koleksi dinamis danBoxsebagai pembungkus nilai tunggal di heap.Menentukan kapan menggunakan
VecatauBoxdalam kasus praktis.Menghubungkan penggunaan
VecdanBoxdengan 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
BoxMengira
Boxbisa menampung koleksi elemen sepertiVec. Padahal hanya satu nilai.
Reallocation di
VecSaat kapasitas penuh,
Vecmelakukan reallocation dan menyalin semua elemen ke lokasi heap baru.Hal ini membuat pointer lama tidak valid, sehingga borrow checker Rust sangat penting.
Ownership
Boxfn main() { let b = Box::new(5); let c = b; // ownership pindah ke c // println!("{}", b); // error: b tidak lagi valid println!("{}", c); }
Refleksi
Mengapa
Veclebih cocok untuk menyimpan banyak data yang sering berubah ukurannya?Mengapa
Boxsering dipakai untuk membuat LinkedList?Bagaimana kesalahan memilih antara
VecdanBoxdapat 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:
VecdanBox. Tersedia di: https://doc.rust-lang.org/std/Sekolah Teknik Elektro dan Informatika, Institut Teknologi Bandung. Praktikum Algoritma dan Struktur Data.


