Coleção Vec

Em Rust já temos coleções implementadas, uma delas é a Vec<T>, é uma coleção que armazena uma quantidade de elementos. A vantagem de usar essa coleção é que diferente de um array é que seu tamanho é flexível. O que nos da certa vantagem. Podemos criar um Vec com os métodos estáticos new ou with_capacity, ou com o macro vec!, sendo a opção com o macro um Vec já inicializado com valores. Podemos declarar o Vec

fn main() {
    let mut vec = Vec::<i32>::new();
    let mut vec2: Vec<i32> = Vec::new();
    let mut vec3 = Vec::<i32>::with_capacity(10); //inicia o Vec já com uma capacidade
    let mut vec4: Vec<i32> = Vec::with_capacity(10); //inicia o Vec já com uma capacidade
    let mut vec5 = vec![1,2,3];
}

Iniciar um Vec já com uma capacidade o que nos da vantagem de deixar mais rápido a inserção de novos elementos nesse Vec, mas não vamos confundir a capacidade dele, com o tamanho dele, a capacidade é "o quanto cabe" e o tamanho é o "o quanto tem".

Note que declaramos todos os Vec como mutáveis, não é obrigatório serem declarados como mutáveis, nós só utilizamos isso caso queiramos realizar qualquer modificação no Vec, como adicionar, ou remover valores do mesmo.

O compilador do Rust é inteligente o suficiente para saber o tipo de um Vec pelo primeiro elemento adicionado.

Métodos de Vec

Em Vec temos diversos métodos, mas agora iremos falar sobre os seguintes métodos: push, pop, len, clear, is_empty, contains, get, get_mut, insert e remove.

Método push

O método push é responsável por adicionar um elemento ao Vec, o método ira falhar caso a capacidade do Vec ultrapasse o valor máximo de um isize

fn main() {
    let mut lista = Vec::new();
    lista.push(10);

    println!("{:?}", lista);
}

Método insert

Com o método insert conseguimos adicionar um valor na posição escolhida

fn main() {
    let mut lista = vec![1, 2, 3];
    lista.insert(0, 4);

    println!("{:?}", lista);
}

Método pop

O método pop remove o último elemento do Vec e nos retornar um Option<T>, sendo o Some caso tenha algum elemento e None caso o Vec esteja vazio.

fn main() {
    let mut lista = vec![1, 2, 3];
    let ultimo: Option<i32> = lista.pop();

    println!("{:?}", lista);
}

Método len

O método len retorna o tamanho do Vec

fn main() {
    let lista = vec![1,2,3];
    let tamanho = lista.len();

    println!("{}", tamanho);
}

Método get

O método get retorna um Option<&T> caso a posição solicitada exista, caso não exista é retornado um None, a vantagem de utilizar este método ao invés de um colchete e a posição [pos] é que se tentarmos acessar uma posição inexistente não paramos a execução da aplicação.

fn main() {
    let lista = vec![1,2,3];
    let primeiro_elemento: Option<&i32> = lista.get(0);
    // let invalido = lista[1000]; //esta linha ira parar a execução do programa
}

Método get_mut

O método get_mut, tem um comportamento parecido com o do método get a principal diferença é que este método nos retorna uma referncia mutável, sendo assim, podemos alterar o valor contido no index. Para que este método possa ser executado, o Vec deve ser mutável

fn main() {
    let mut lista = vec![1, 2, 3];
    let r = lista.get_mut(0).unwrap();
    *r = 10;
    println!("{:?}", lista);
}

Método remove

Com o método remove, podemos remover um item do Vec informando a sua posição. Claro para isso o Vec deve ser mutável.

fn main() {
    let mut lista = vec![1, 2, 3];
    lista.remove(0);
    println!("{:?}", lista);
}

Método clear

O método clear limpa o Vec o deixando vazio

fn main() {
    let mut lista = vec![1,2,3];
    lista.clear();
    println!("Tamanho da lista {}", lista.len());
}

Método is_empty

O método is_empty retorna um booleano, sendo true caso esteja vazio e false caso o tenha algum elemento

fn main() {
    let lista = Vec::<i32>::new();
    if lista.is_empty() {
        println!("A lista esta vazia");
    }
}

Método contains

O método containsretorna um booleano, sendo true caso o valor exista e false caso não exista.

fn main() {
    let lista = vec![1, 2, 3];
    if lista.contains(&3) {
        println!("O numero 3 existe na lista");
    }
}