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, como String e HashMap. 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 especificar T explicitamente. Como sempre, com a inferência de tipos do Rust, T foi estabelecido durante a primeira chamada de push.
  • vec![...] é uma macro canônica para usar em vez de Vec::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, usando get você obterá um Option. A função pop 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.