Ce face vec!
vec![a, b, c] creează un Vec care conține elementele date, în ordine. Este echivalentul scurt al lui Vec::new() urmat de câte un push, dar alocă memoria o singură dată, exact cât trebuie. Tipul elementelor se deduce din valori.
vec![valoare; n] creează un vector cu n copii ale valorii (valoarea trebuie să implementeze Clone). Spre deosebire de array-ul [0; n], aici n poate fi o variabilă aflată la rulare. vec![] creează un vector gol (tipul trebuie să reiasă din context).
Vectorul creat este un Vec obișnuit, deci poate crește cu push, dacă variabila este mut. Dacă lista are lungime fixă și nu se modifică, un array ([1, 2, 3]) este suficient și nu alocă memorie.
Exemple
Exemplul 1: Cele trei forme
Un vector cu elemente, unul cu 5 zerouri (lungimea vine dintr-o variabilă) și unul gol, completat apoi cu push.
fn main() {
let orase = vec!["Iași", "Cluj", "Timișoara"];
let zile = 5;
let mut vanzari = vec![0; zile];
let mut cumparatori: Vec<String> = vec![];
vanzari[2] = 17;
cumparatori.push(String::from("Ana"));
println!("{orase:?} ({} orașe)", orase.len());
println!("{vanzari:?}");
println!("{cumparatori:?}");
}
Rezultat
["Iași", "Cluj", "Timișoara"] (3 orașe)
[0, 0, 17, 0, 0]
["Ana"]
Exemplul 2: Matrice cu vec! imbricat
vec![vec![0; coloane]; randuri] clonează rândul de randuri ori, deci fiecare rând este un vector independent. Modificarea unui rând nu le afectează pe celelalte.
fn main() {
let (randuri, coloane) = (3, 4);
let mut sala = vec![vec!['.'; coloane]; randuri];
sala[0][1] = 'X';
sala[2][3] = 'X';
for rand in &sala {
println!("{}", rand.iter().collect::<String>());
}
}
Rezultat
.X..
....
...X
Greșeli frecvente
- Scrii
vec![1, 2, 3; 2]amestecând cele două forme. Folosește fie lista, fievaloare; n. - Folosești
vec![]fără să se poată deduce tipul:type annotations needed for `Vec<_>`. Scrie tipul:let v: Vec<u32> = vec![];. - Creezi un vector doar ca să-l parcurgi o dată (
for x in vec![1, 2, 3]). Un array ([1, 2, 3]) nu alocă memorie; Clippy semnalează asta causeless_vec.
Comenzi înrudite
array ([T; N]): Un șir de lungime fixă, cunoscută la compilare, cu elemente de același tip, păstrat direct pe stivă.slice-uri (&[T] și &str): O „fereastră” spre o parte dintr-un array, Vec sau text: o referință care știe de unde începe și câte elemente are, fără să copieze nimic.macro_rules!: Definește un macro propriu: cod care scrie cod la compilare, după tipare. Așa sunt construite println!, vec! sau assert_eq!.for … in: Parcurge pe rând fiecare element al unui interval, al unei colecții sau al unui iterator.