HashMap & BTreeMap
HashMap oferece consultas rápidas em média. BTreeMap mantém as chaves ordenadas para consultas de intervalo e iteração determinística.
Receita
use std::collections::HashMap;
fn count_words(text: &str) -> HashMap<&str, u32> {
let mut counts = HashMap::new();
for word in text.split_whitespace() {
*counts.entry(word).or_insert(0) += 1;
}
counts
}Quando usar isso: Tabelas de frequência, índices, caches - escolha BTreeMap quando a ordem ou varreduras de intervalo forem importantes.
Exemplo de Trabalho
use std::collections::BTreeMap;
fn top3(scores: BTreeMap<&str, i32>) -> Vec<(&str, i32)> {
let mut v: Vec<_> = scores.into_iter().collect();
v.sort_by(|a, b| b.1.cmp(&a.1));
v.truncate(3);
v
}O que isso demonstra:
BTreeMapitera as chaves em ordem- Converte para
Vecpara ordenação personalizada por valor - A API
entryevita consulta dupla no exemplo de contagem
Mergulho Profundo
HashMap precisa de BuildHasher (o padrão é RandomState). BTreeMap precisa de chaves Ord. entry retorna OccupiedEntry / VacantEntry.
Armadilhas
- Chave não-Ord em BTreeMap - floats sem wrapper falham. Correção:
OrderedFloatou chave inteira. - HashDoS - O hasher padrão é bom para aplicativos; considere
ahash/fxhashpara desempenho (crates). - Iterar enquanto muta - Use
entryem vez deget+insertseparadamente. - Consulta de empréstimo de chave -
map.get("str")para chavesStringviaBorrow. - Capacidade -
HashMap::with_capacity(n)reduz a realocação.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
IndexMap | Ordem de inserção | Política apenas do std |
DashMap | Mapa concorrente | Single-threaded |
Vec de pares | n muito pequeno | Tabelas de consulta grandes |
FAQs
entry or_insert?
Insere o padrão se estiver vago.and_modify?
Atualiza o ocupado na cadeia.range BTreeMap?
range((Bound, Bound)).chave hash própria?
Chaves são de propriedade, a menos que &str com tempo de vida.mapa serde?
Objetos JSON mapeiam.chaves eq?
Requer Eq + Hash para HashMap.swap_remove Vec?
Não são mapas - remove em HashMap O(1) em média.raw_entry?
Caminhos instáveis/experimentais avançados da API entry.hash no_std?
hashbrown em ecossistemas de alocação.perfil?
Conta a realocação em mapas quentes.Relacionado
- API Entry & Atualizações In-Place
- Noções Básicas de Coleções
- VecDeque, BinaryHeap & LinkedList
- Hashing
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4 e Polars 0.46+.