Vec & Slices
Vec<T> possui um buffer expansível. &[T] empresta uma visualização contígua de Vec, arrays ou outros dados.
Receita
fn sum(slice: &[i32]) -> i32 {
slice.iter().sum()
}
fn main() {
let v = vec![1, 2, 3];
println!("{}", sum(&v));
println!("{:?}", &v[1..]);
}Quando usar isto: Array dinâmico padrão; exponha &[T] em APIs de leitura.
Exemplo Funcional
fn dedup_sorted(v: &mut Vec<i32>) {
v.sort_unstable();
v.dedup();
}
fn main() {
let mut data = vec![3, 1, 2, 2, 3];
dedup_sorted(&mut data);
println!("{:?}", data);
}O que isto demonstra:
sort_unstable+dedupin-placeVecmutável passado por&mut- Slice
&v[1..]compartilha o buffer de base
Mergulho Profundo
len, capacity, reserve, shrink_to_fit, split_at, windows, chunks. Vec faz coerção de dereferência para [T].
Armadilhas
- Pânico de índice -
v[i]fora dos limites. Correção:get(i). - Iterando enquanto muta - Conflito de empréstimo. Correção: Passagens separadas ou
retain. - Memória de capacidade excessiva -
shrink_to_fitapós construção temporária grande. - Semântica de
drain- Remove um intervalo durante a iteração. - Tipos de tamanho zero - Comportamento estranho de capacidade de
Vec<()>- caso extremo.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
SmallVec | Geralmente pequeno | Sempre ok com heap |
ArrayVec | Máximo fixo, pilha | Crescimento ilimitado |
Box<[T]> | Slice imutável de tamanho fixo possuído | Precisa de push |
FAQs
with_capacity?
Quando o tamanho é conhecido aproximadamente.from_raw_parts?
Inseguro - evite a menos que seja especialista.splice?
Substitui um intervalo por um iterador.truncate?
Descarta elementos finais.as_slice?
Explicitamente `&[T]` de `Vec`.mem::take?
Substitui rapidamente um vec por um vazio.align?
`Vec` alinha-se aos requisitos de `T`.serde Vec?
Serialização padrão de sequência.no_std?
`alloc::vec::Vec` com o crate `alloc`.sort stable?
Compromisso entre `sort` e `sort_unstable`.Relacionado
- Noções Básicas de Coleções
- IntoIterator & Possuído vs Emprestado
- Referências & Slices
- API de Entrada & Atualizações In-Place
Versões da Pilha: 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+.