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.