Vec
Vec
é o buffer padrão redimensionável alocado no heap:
fn main() { let mut v1 = Vec::new(); v1.push(42); println!("v1: tamanho = {}, capacidade = {}", v1.len(), v1.capacity()); let mut v2 = Vec::with_capacity(v1.len() + 1); v2.extend(v1.iter()); v2.push(9999); println!("v2: tamanho = {}, capacidade = {}", v2.len(), v2.capacity()); // Macro canônica para inicializar um vetor com elementos. let mut v3 = vec![0, 0, 1, 2, 3, 4]; // Mantém apenas os elementos pares. v3.retain(|x| x % 2 == 0); println!("{v3:?}"); // Remove duplicatas consecutivas. v3.dedup(); println!("{v3:?}"); }
Vec
implementa Deref<Target = [T]>
, o que significa que você pode chamar métodos de slice em um Vec
.
This slide should take about 5 minutes.
Vec
é um tipo de coleção, comoString
eHashMap
. Os dados que ele contém são armazenados no heap. Isso significa que a quantidade de dados não precisa ser conhecida em tempo de compilação. Ela pode crescer ou encolher em tempo de execução.- Observe como
Vec<T>
também é um tipo genérico, mas você não precisa especificarT
explicitamente. Como sempre, com a inferência de tipos do Rust,T
foi estabelecido durante a primeira chamada depush
. vec![...]
é uma macro canônica para usar em vez deVec::new()
e suporta a adição de elementos iniciais ao vetor.- Para indexar o vetor, você usa
[
]
, mas uma exceção do tipo pânico (panic
) será gerada se o índice estiver fora dos limites. Alternativamente, usandoget
você obterá umOption
. A funçãopop
removerá o último elemento. - Os slices são abordados no dia 3. Por enquanto, os alunos só precisam saber que um valor do tipo
Vec
dá acesso a todos os métodos de slice documentados, também.