Rust Coleções Intermediário
Vec e HashMap
Em Rust, as coleções mais usadas do dia a dia são Vec<T> e HashMap<K, V>. O Vec é uma lista dinâmica que guarda elementos de um mesmo tipo em sequência, permitindo acesso rápido por índice e crescimento automático. Já o HashMap armazena pares chave-valor, oferecendo busca média em tempo constante — ideal para contar, agrupar ou indexar dados por uma chave.
Ambos vivem na heap e são genéricos: você escolhe o tipo dos elementos. Para criar, use Vec::new() ou a macro vec![], e HashMap::new(). A inserção no Vec é feita com push, e no HashMap com insert. A grande estrela do HashMap é a entry API: map.entry(chave).or_insert(valor) insere um valor padrão se a chave não existir e devolve uma referência mutável ao valor, tudo em uma única operação.
Iterar é onde as coleções brilham. Com for você percorre &vec (emprestando), &mut vec (modificando) ou vec (consumindo). No HashMap, a iteração devolve tuplas (&K, &V), e você pode usar .iter(), .keys() ou .values(). Combinar entry com iteração é a base de padrões como contagem de frequência e agrupamento.
Neste card, vamos praticar a criação, inserção, busca e iteração com Vec e HashMap, sempre usando a entry API para evitar buscas duplicadas.
Pontos-chave
Vec<T>é uma lista dinâmica;HashMap<K, V>associa chaves a valores.- Use
vec![]para criar vetores eHashMap::new()para mapas. - A entry API (
entry(k).or_insert(v)) insere se não existir e devolve&mut V. - Itere com
for x in &vecoufor (k, v) in &mappara não consumir a coleção. HashMapnão garante ordem; para ordenar, colete emVece usesort.
use std::collections::HashMap;
fn main() {
// Vec: lista dinâmica de notas
let mut notas = vec![8, 6, 9, 7, 10];
notas.push(5); // adiciona no fim
let soma: i32 = notas.iter().sum();
let media = soma as f64 / notas.len() as f64;
println!("Notas: {:?}", notas);
println!("Média: {:.2}", media);
// HashMap: contagem de frequência com entry API
let palavras = vec!["rust", "vec", "rust", "hashmap", "vec", "rust"];
let mut contagem: HashMap<&str, u32> = HashMap::new();
for p in &palavras {
// se a chave não existe, insere 0; depois soma 1
*contagem.entry(*p).or_insert(0) += 1;
}
// Iteração sobre o HashMap (ordem não garantida)
for (palavra, qtd) in &contagem {
println!("{}: {}", palavra, qtd);
}
// Busca segura com get
if let Some(qtd) = contagem.get("rust") {
println!("A palavra 'rust' aparece {} vezes", qtd);
}
}