Lewati ke konten

Vektor di Rust

Vektor (Vec) mirip dengan array, tapi ukurannya bisa bertambah dan berkurang saat program berjalan. Di kode Rust sehari-hari, kalau kamu butuh sebuah daftar, kamu akan jauh lebih sering memakai Vec daripada array berukuran tetap.

fn main() {
let numbers: Vec<i32> = vec![1, 2, 3];
println!("{:?}", numbers);
}

vec![] adalah sebuah makro (perhatikan tanda !) yang membuat Vec dari daftar nilai, mirip dengan cara kamu menulis array.

▶ Coba sendiri

Kamu juga bisa mulai dari vektor kosong lalu mengisinya sedikit demi sedikit:

let mut numbers: Vec<i32> = Vec::new();

Pakai .push() untuk menambah elemen di akhir. Vektornya harus mut karena kamu mengubahnya:

fn main() {
let mut numbers = Vec::new();
numbers.push(1);
numbers.push(2);
numbers.push(3);
println!("{:?}", numbers);
}

Output:

[1, 2, 3]
▶ Coba sendiri

Sintaks kurung sikunya sama seperti array:

fn main() {
let fruits = vec!["apel", "pisang", "ceri"];
println!("{}", fruits[0]);
println!("Panjang: {}", fruits.len());
}
▶ Coba sendiri

Untuk mencari elemen dengan lebih aman tanpa panic kalau indeksnya salah, pakai .get(), yang mengembalikan sebuah Option (selengkapnya di halaman Option):

fn main() {
let fruits = vec!["apel", "pisang", "ceri"];
match fruits.get(10) {
Some(fruit) => println!("Ketemu: {fruit}"),
None => println!("Tidak ada buah di indeks itu"),
}
}
▶ Coba sendiri
fn main() {
let mut numbers = vec![1, 2, 3, 4, 5];
numbers.pop(); // menghapus item terakhir -> [1, 2, 3, 4]
numbers.remove(0); // menghapus berdasarkan indeks -> [2, 3, 4]
println!("{:?}", numbers);
}
▶ Coba sendiri
fn main() {
let numbers = vec![10, 20, 30];
for n in &numbers {
println!("{n}");
}
}
▶ Coba sendiri

Perhatikan tanda & sebelum numbers. Perulangan for n in &numbers meminjam (borrow) setiap item alih-alih mengambil ownership (kepemilikan) vektornya. Kalau kamu menghapus &, vektornya dipindahkan (move) ke dalam perulangan, artinya kamu tidak bisa memakai numbers lagi setelahnya. Hampir selalu, meminjam adalah yang kamu mau.

Kamu mungkin memperhatikan bahwa tipenya ditulis Vec<i32>. Bagian <i32> berarti “vektor berisi nilai i32.” Notasi kurung sudut ini disebut generics, dan kamu akan membahasnya dengan benar di halaman Generik. Untuk sekarang, baca saja Vec<T> sebagai “vektor yang menyimpan nilai bertipe T.”

Mulai dengan vektor kosong. Lakukan perulangan pada angka 1 sampai 10 dan push hanya yang genap. Lalu cetak vektornya dan berapa banyak item di dalamnya. Petunjuk: sebuah angka n genap kalau n % 2 == 0.

Lihat solusi
fn main() {
let mut evens = Vec::new();
for n in 1..=10 {
if n % 2 == 0 {
evens.push(n);
}
}
println!("{:?}", evens);
println!("Ditemukan {} bilangan genap", evens.len());
}

Output:

[2, 4, 6, 8, 10]
Ditemukan 5 bilangan genap
▶ Coba sendiri

Perhatikan bahwa kita tidak pernah menulis tipenya. Rust melihat pemanggilan push(n) dan menyimpulkan bahwa evens adalah Vec<i32>.

Masukkan tiga piring ke sebuah vektor: "biru", "hijau", lalu "merah". Ambil dua piring dari atas dengan .pop() dan cetak masing-masing. Terakhir, cetak apa yang tersisa. Petunjuk: .pop() mengembalikan Option, jadi cetak dengan {:?}.

Lihat solusi
fn main() {
let mut plates = Vec::new();
plates.push("biru");
plates.push("hijau");
plates.push("merah");
println!("Diambil {:?}", plates.pop());
println!("Diambil {:?}", plates.pop());
println!("Sisa: {:?}", plates);
}

Output:

Diambil Some("merah")
Diambil Some("hijau")
Sisa: ["biru"]
▶ Coba sendiri

pop() selalu mengambil item terakhir yang kamu masukkan, seperti mengambil piring paling atas dari tumpukan. Hasilnya Some(...), bukan nilainya langsung, karena vektornya bisa saja kosong. Dalam kasus itu kamu akan mendapat None, bukan crash.

  • Vec<T> adalah daftar yang ukurannya bisa bertambah; buat dengan vec![...] atau Vec::new().
  • .push() menambah di akhir; .pop() menghapus item terakhir; .remove(i) menghapus berdasarkan indeks.
  • vec[i] membuat program panic kalau indeksnya salah; .get(i) mengembalikan Option dan tidak akan panic.
  • Lakukan perulangan dengan for item in &vec untuk meminjam item tanpa menghabiskan vektornya.

Kuis singkat

1. Apa yang terjadi kalau kamu mengakses Vec dengan indeks yang salah, seperti numbers[10]?

2. Method mana yang membuatmu bisa mencari berdasarkan indeks tanpa risiko panic?

3. Apa fungsi tanda & di for n in &numbers?

Skor: 0 / 3