Ferrugem - Coleções
A biblioteca de coleção padrão do Rust fornece implementações eficientes das estruturas de dados de programação de propósito geral mais comuns. Este capítulo discute a implementação das coleções comumente usadas - Vector, HashMap e HashSet.
Vetor
Um vetor é uma matriz redimensionável. Ele armazena valores em blocos de memória contíguos. A estrutura predefinida Vec pode ser usada para criar vetores. Algumas características importantes de um vetor são -
Um vetor pode aumentar ou diminuir em tempo de execução.
Um vetor é uma coleção homogênea.
Um vetor armazena dados como sequência de elementos em uma ordem particular. Cada elemento em um vetor é atribuído a um número de índice exclusivo. O índice começa em 0 e vai até n-1, onde, n é o tamanho da coleção. Por exemplo, em uma coleção de 5 elementos, o primeiro elemento estará no índice 0 e o último elemento estará no índice 4.
Um vetor só acrescentará valores ao (ou próximo) ao final. Em outras palavras, um vetor pode ser usado para implementar uma pilha.
A memória para um vetor é alocada no heap.
Sintaxe - Criando um Vetor
let mut instance_name = Vec::new();
O método estático new () da estrutura Vec é usado para criar uma instância de vetor.
Como alternativa, um vetor também pode ser criado usando o vec! macro. A sintaxe é a seguinte -
let vector_name = vec![val1,val2,val3]
A tabela a seguir lista algumas funções comumente usadas da estrutura Vec.
Sr. Não | Método | Assinatura e Descrição |
---|---|---|
1 | Novo() | pub fn new()->Vect Constrói um novo Vec vazio. O vetor não será alocado até que os elementos sejam colocados nele. |
2 | empurrar() | pub fn push(&mut self, value: T) Acrescenta um elemento ao final de uma coleção. |
3 | retirar() | pub fn remove(&mut self, index: usize) -> T Remove e retorna o elemento no índice de posição dentro do vetor, deslocando todos os elementos após ele para a esquerda. |
4 | contém () | pub fn contains(&self, x: &T) -> bool Retorna verdadeiro se a fatia contiver um elemento com o valor fornecido. |
5 | len () | pub fn len(&self) -> usize Retorna o número de elementos no vetor, também conhecido como 'comprimento'. |
Ilustração: Criando um Vetor - novo ()
Para criar um vetor, usamos o método estático new -
fn main() {
let mut v = Vec::new();
v.push(20);
v.push(30);
v.push(40);
println!("size of vector is :{}",v.len());
println!("{:?}",v);
}
O exemplo acima cria um Vector usando o método estático new () que é definido na estrutura Vec . A função push (val) anexa o valor passado como parâmetro à coleção. A função len () retorna o comprimento do vetor.
Resultado
size of vector is :3
[20, 30, 40]
Ilustração: Criando um Vetor - vec! Macro
O código a seguir cria um vetor usando o comando vec! macro. O tipo de dados do vetor é inferido como o primeiro valor atribuído a ele.
fn main() {
let v = vec![1,2,3];
println!("{:?}",v);
}
Resultado
[1, 2, 3]
Conforme mencionado anteriormente, um vetor só pode conter valores do mesmo tipo de dados. O seguinte snippet gerará um erro [E0308]: erro de tipos incompatíveis .
fn main() {
let v = vec![1,2,3,"hello"];
println!("{:?}",v);
}
Ilustração: push ()
Acrescenta um elemento ao final de uma coleção.
fn main() {
let mut v = Vec::new();
v.push(20);
v.push(30);
v.push(40);
println!("{:?}",v);
}
Resultado
[20, 30, 40]
Ilustração: remove ()
Remove e retorna o elemento no índice de posição dentro do vetor, deslocando todos os elementos após ele para a esquerda.
fn main() {
let mut v = vec![10,20,30];
v.remove(1);
println!("{:?}",v);
}
Resultado
[10, 30]
Ilustração - contém ()
Retorna verdadeiro se a fatia contiver um elemento com o valor fornecido -
fn main() {
let v = vec![10,20,30];
if v.contains(&10) {
println!("found 10");
}
println!("{:?}",v);
}
Resultado
found 10
[10, 20, 30]
Ilustração: len ()
Retorna o número de elementos no vetor, também conhecido como 'comprimento'.
fn main() {
let v = vec![1,2,3];
println!("size of vector is :{}",v.len());
}
Resultado
size of vector is :3
Acessando valores de um vetor
Elementos individuais em um vetor podem ser acessados usando seus números de índice correspondentes. O exemplo a seguir cria um anúncio vetorial e imprime o valor do primeiro elemento.
fn main() {
let mut v = Vec::new();
v.push(20);
v.push(30);
println!("{:?}",v[0]);
}
Output: `20`
Os valores em um vetor também podem ser buscados usando referência à coleção.
fn main() {
let mut v = Vec::new();
v.push(20);
v.push(30);
v.push(40);
v.push(500);
for i in &v {
println!("{}",i);
}
println!("{:?}",v);
}
Resultado
20
30
40
500
[20, 30, 40, 500]
HashMap
Um mapa é uma coleção de pares de valores-chave (chamados de entradas). Duas entradas em um mapa não podem ter a mesma chave. Resumindo, um mapa é uma tabela de consulta. Um HashMap armazena as chaves e os valores em uma tabela hash. As entradas são armazenadas em uma ordem arbitrária. A chave é usada para pesquisar valores no HashMap. A estrutura HashMap é definida nostd::collectionsmódulo. Este módulo deve ser importado explicitamente para acessar a estrutura HashMap.
Sintaxe: Criando um HashMap
let mut instance_name = HashMap::new();
O método estático new () da estrutura HashMap é usado para criar um objeto HashMap. Este método cria um HashMap vazio.
As funções comumente usadas de HashMap são discutidas abaixo -
Sr. Não | Método | Assinatura e Descrição |
---|---|---|
1 | inserir() | pub fn insert(&mut self, k: K, v: V) -> Option Insere um par chave / valor; se nenhuma chave, então Nenhum é retornado. Após a atualização, o valor antigo é retornado. |
2 | len () | pub fn len(&self) -> usize Retorna o número de elementos no mapa. |
3 | pegue() | pub fn get<Q: ?Sized>(&lself, k: &Q) -> Option<&V> where K:Borrow Q:Hash+ Eq Retorna uma referência ao valor correspondente à chave. |
4 | iter () | pub fn iter(&self) -> Iter<K, V> Um iterador que visita todos os pares de valores-chave em ordem arbitrária. O tipo de elemento iterador é (& 'a K, &' a V). |
5 | contém_chave | pub fn contains_key<Q: ?Sized>(&self, k: &Q) -> bool Retorna verdadeiro se o mapa contém um valor para a chave especificada. |
6 | retirar() | pub fn remove_entry<Q: ?Sized>(&mut self, k: &Q) -> Option<(K, V)> Remove uma chave do mapa, retornando a chave e o valor armazenados se a chave estava anteriormente no mapa. |
Ilustração: inserir ()
Insere um par chave / valor no HashMap.
use std::collections::HashMap;
fn main(){
let mut stateCodes = HashMap::new();
stateCodes.insert("KL","Kerala");
stateCodes.insert("MH","Maharashtra");
println!("{:?}",stateCodes);
}
O programa acima cria um HashMap e o inicializa com 2 pares de valores-chave.
Resultado
{"KL": "Kerala", "MH": "Maharashtra"}
Ilustração: len ()
Retorna o número de elementos no mapa
use std::collections::HashMap;
fn main() {
let mut stateCodes = HashMap::new();
stateCodes.insert("KL","Kerala");
stateCodes.insert("MH","Maharashtra");
println!("size of map is {}",stateCodes.len());
}
O exemplo acima cria um HashMap e imprime o número total de elementos nele.
Resultado
size of map is 2
Ilustração - get ()
Retorna uma referência ao valor correspondente à chave. O exemplo a seguir recupera o valor da chave KL no HashMap.
use std::collections::HashMap;
fn main() {
let mut stateCodes = HashMap::new();
stateCodes.insert("KL","Kerala");
stateCodes.insert("MH","Maharashtra");
println!("size of map is {}",stateCodes.len());
println!("{:?}",stateCodes);
match stateCodes.get(&"KL") {
Some(value)=> {
println!("Value for key KL is {}",value);
}
None => {
println!("nothing found");
}
}
}
Resultado
size of map is 2
{"KL": "Kerala", "MH": "Maharashtra"}
Value for key KL is Kerala
Ilustração - iter ()
Retorna um iterador contendo referência a todos os pares de valores-chave em uma ordem arbitrária.
use std::collections::HashMap;
fn main() {
let mut stateCodes = HashMap::new();
stateCodes.insert("KL","Kerala");
stateCodes.insert("MH","Maharashtra");
for (key, val) in stateCodes.iter() {
println!("key: {} val: {}", key, val);
}
}
Resultado
key: MH val: Maharashtra
key: KL val: Kerala
Ilustração: contains_key ()
Retorna verdadeiro se o mapa contém um valor para a chave especificada.
use std::collections::HashMap;
fn main() {
let mut stateCodes = HashMap::new();
stateCodes.insert("KL","Kerala");
stateCodes.insert("MH","Maharashtra");
stateCodes.insert("GJ","Gujarat");
if stateCodes.contains_key(&"GJ") {
println!("found key");
}
}
Resultado
found key
Ilustração: remove ()
Remove uma chave do mapa.
use std::collections::HashMap;
fn main() {
let mut stateCodes = HashMap::new();
stateCodes.insert("KL","Kerala");
stateCodes.insert("MH","Maharashtra");
stateCodes.insert("GJ","Gujarat");
println!("length of the hashmap {}",stateCodes.len());
stateCodes.remove(&"GJ");
println!("length of the hashmap after remove() {}",stateCodes.len());
}
Resultado
length of the hashmap 3
length of the hashmap after remove() 2
HashSet
HashSet é um conjunto de valores exclusivos do tipo T. Adicionar e remover valores é rápido e é rápido perguntar se um determinado valor está no conjunto ou não. A estrutura HashSet é definida no módulo std :: Collections. Este módulo deve ser importado explicitamente para acessar a estrutura HashSet.
Sintaxe: Criando um HashSet
let mut hash_set_name = HashSet::new();
O método estático, novo , da estrutura HashSet é usado para criar um HashSet. Este método cria um HashSet vazio.
A tabela a seguir lista alguns dos métodos comumente usados da estrutura HashSet.
Sr. Não | Método | Assinatura e Descrição |
---|---|---|
1 | inserir() | pub fn insert(&mut self, value: T) -> bool Adiciona um valor ao conjunto. Se o conjunto não tiver este valor presente, true é retornado, caso contrário, false. |
2 | len () | pub fn len(&self) -> usize Retorna o número de elementos do conjunto. |
3 | pegue() | pub fn get<Q:?Sized>(&self, value: &Q) -> Option<&T> where T: Borrow,Q: Hash + Eq, Retorna uma referência ao valor no conjunto, se houver alguma que seja igual ao valor fornecido. |
4 | iter () | pub fn iter(&self) -> Iter Retorna um iterador visitando todos os elementos em ordem arbitrária. O tipo de elemento iterador é & 'a T. |
5 | contém_chave | pub fn contains<Q: ?Sized>(&self, value: &Q) -> bool Retorna verdadeiro se o conjunto contiver um valor. |
6 | retirar() | pub fn remove<Q: ?Sized>(&mut self, value: &Q) -> bool Remove um valor do conjunto. Retorna verdadeiro se o valor estava presente no conjunto. |
Ilustração - inserir ()
Adiciona um valor ao conjunto. Um HashSet não adiciona valores duplicados à coleção.
use std::collections::HashSet;
fn main() {
let mut names = HashSet::new();
names.insert("Mohtashim");
names.insert("Kannan");
names.insert("TutorialsPoint");
names.insert("Mohtashim");//duplicates not added
println!("{:?}",names);
}
Resultado
{"TutorialsPoint", "Kannan", "Mohtashim"}
Ilustração: len ()
Retorna o número de elementos do conjunto.
use std::collections::HashSet;
fn main() {
let mut names = HashSet::new();
names.insert("Mohtashim");
names.insert("Kannan");
names.insert("TutorialsPoint");
println!("size of the set is {}",names.len());
}
Resultado
size of the set is 3
Ilustração - iter ()
Recupera um iterador visitando todos os elementos em ordem arbitrária.
use std::collections::HashSet;
fn main() {
let mut names = HashSet::new();
names.insert("Mohtashim");
names.insert("Kannan");
names.insert("TutorialsPoint");
names.insert("Mohtashim");
for name in names.iter() {
println!("{}",name);
}
}
Resultado
TutorialsPoint
Mohtashim
Kannan
Ilustração: get ()
Retorna uma referência ao valor no conjunto, se houver, que é igual ao valor fornecido.
use std::collections::HashSet;
fn main() {
let mut names = HashSet::new();
names.insert("Mohtashim");
names.insert("Kannan");
names.insert("TutorialsPoint");
names.insert("Mohtashim");
match names.get(&"Mohtashim"){
Some(value)=>{
println!("found {}",value);
}
None =>{
println!("not found");
}
}
println!("{:?}",names);
}
Resultado
found Mohtashim
{"Kannan", "Mohtashim", "TutorialsPoint"}
Ilustração - contém ()
Retorna verdadeiro se o conjunto contiver um valor.
use std::collections::HashSet;
fn main() {
let mut names = HashSet::new();
names.insert("Mohtashim");
names.insert("Kannan");
names.insert("TutorialsPoint");
if names.contains(&"Kannan") {
println!("found name");
}
}
Resultado
found name
Ilustração: remove ()
Remove um valor do conjunto.
use std::collections::HashSet;
fn main() {
let mut names = HashSet::new();
names.insert("Mohtashim");
names.insert("Kannan");
names.insert("TutorialsPoint");
println!("length of the Hashset: {}",names.len());
names.remove(&"Kannan");
println!("length of the Hashset after remove() : {}",names.len());
}
Resultado
length of the Hashset: 3
length of the Hashset after remove() : 2