Rust - Kolekcje
Biblioteka kolekcji standardowych Rusta zapewnia wydajne implementacje najpopularniejszych struktur danych programowania ogólnego przeznaczenia. W tym rozdziale omówiono implementację najczęściej używanych kolekcji - Vector, HashMap i HashSet.
Wektor
Vector to tablica o zmiennym rozmiarze. Przechowuje wartości w ciągłych blokach pamięci. Do tworzenia wektorów można wykorzystać predefiniowaną strukturę Vec. Niektóre ważne cechy Vector to -
Wektor może rosnąć lub zmniejszać się w czasie wykonywania.
Wektor to zbiór jednorodny.
Vector przechowuje dane jako sekwencje elementów w określonej kolejności. Każdy element wektora ma przypisany unikalny numer indeksu. Indeks zaczyna się od 0 i dochodzi do n-1, gdzie n jest rozmiarem kolekcji. Na przykład w kolekcji 5 elementów pierwszy element będzie miał indeks 0, a ostatni element będzie miał indeks 4.
Wektor doda wartości tylko na końcu (lub blisko). Innymi słowy, do implementacji stosu można użyć wektora.
Pamięć dla wektora jest przydzielana w stercie.
Składnia - tworzenie wektora
let mut instance_name = Vec::new();
Metoda statyczna nowy () z Vec konstrukcji jest stosowany do tworzenia wystąpienie wektorowych.
Alternatywnie wektor można również utworzyć za pomocą polecenia vec! makro. Składnia jest taka, jak podano poniżej -
let vector_name = vec![val1,val2,val3]
W poniższej tabeli wymieniono niektóre często używane funkcje struktury Vec.
Sr.No | metoda | Podpis i opis |
---|---|---|
1 | Nowy() | pub fn new()->Vect Konstruuje nowy, pusty Vec. Wektor nie zostanie przydzielony, dopóki elementy nie zostaną do niego przesunięte. |
2 | Pchać() | pub fn push(&mut self, value: T) Dołącza element z tyłu kolekcji. |
3 | usunąć() | pub fn remove(&mut self, index: usize) -> T Usuwa i zwraca element z indeksem pozycji w wektorze, przesuwając wszystkie elementy po nim w lewo. |
4 | zawiera () | pub fn contains(&self, x: &T) -> bool Zwraca wartość true, jeśli wycinek zawiera element o podanej wartości. |
5 | len () | pub fn len(&self) -> usize Zwraca liczbę elementów w wektorze, nazywaną również jego „długością”. |
Ilustracja: Tworzenie wektora - new ()
Do stworzenia wektora używamy statycznej metody 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);
}
Powyższy przykład tworzy Vector przy użyciu statycznej metody new () zdefiniowanej w strukturze Vec . Funkcja push (val) dołącza wartość przekazaną jako parametr do kolekcji. Funkcja len () zwraca długość wektora.
Wynik
size of vector is :3
[20, 30, 40]
Ilustracja: Tworzenie wektora - vec! Makro
Poniższy kod tworzy wektor przy użyciu polecenia vec! makro. Typ danych wektora jest wywnioskowany jako pierwsza przypisana mu wartość.
fn main() {
let v = vec![1,2,3];
println!("{:?}",v);
}
Wynik
[1, 2, 3]
Jak wspomniano wcześniej, wektor może zawierać tylko wartości tego samego typu danych. Poniższy fragment kodu zgłosi błąd [E0308]: błąd niezgodnych typów .
fn main() {
let v = vec![1,2,3,"hello"];
println!("{:?}",v);
}
Ilustracja: push ()
Dołącza element na końcu kolekcji.
fn main() {
let mut v = Vec::new();
v.push(20);
v.push(30);
v.push(40);
println!("{:?}",v);
}
Wynik
[20, 30, 40]
Ilustracja: usuń ()
Usuwa i zwraca element z indeksem pozycji w wektorze, przesuwając wszystkie elementy po nim w lewo.
fn main() {
let mut v = vec![10,20,30];
v.remove(1);
println!("{:?}",v);
}
Wynik
[10, 30]
Ilustracja - zawiera ()
Zwraca wartość true, jeśli wycinek zawiera element o podanej wartości -
fn main() {
let v = vec![10,20,30];
if v.contains(&10) {
println!("found 10");
}
println!("{:?}",v);
}
Wynik
found 10
[10, 20, 30]
Ilustracja: len ()
Zwraca liczbę elementów w wektorze, nazywaną również jego „długością”.
fn main() {
let v = vec![1,2,3];
println!("size of vector is :{}",v.len());
}
Wynik
size of vector is :3
Dostęp do wartości z obiektu Vector
Dostęp do poszczególnych elementów w wektorze można uzyskać za pomocą odpowiednich numerów indeksu. Poniższy przykład tworzy reklamę wektorową, drukuje wartość pierwszego elementu.
fn main() {
let mut v = Vec::new();
v.push(20);
v.push(30);
println!("{:?}",v[0]);
}
Output: `20`
Wartości w wektorze można również pobrać za pomocą odniesienia do kolekcji.
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);
}
Wynik
20
30
40
500
[20, 30, 40, 500]
HashMap
Mapa to zbiór par klucz-wartość (zwanych wpisami). Żadne dwa wpisy na mapie nie mogą mieć tego samego klucza. Krótko mówiąc, mapa to tablica przeglądowa. HashMap przechowuje klucze i wartości w tabeli skrótów. Wpisy są przechowywane w dowolnej kolejności. Klucz służy do wyszukiwania wartości w HashMap. Struktura HashMap jest zdefiniowana wstd::collectionsmoduł. Ten moduł należy jawnie zaimportować, aby uzyskać dostęp do struktury HashMap.
Składnia: tworzenie HashMap
let mut instance_name = HashMap::new();
Metoda statyczna nowy () z hashmap strukturze służy do utworzenia obiektu hashmap. Ta metoda tworzy pusty HashMap.
Często używane funkcje HashMap zostały omówione poniżej -
Sr.No | metoda | Podpis i opis |
---|---|---|
1 | wstawić() | pub fn insert(&mut self, k: K, v: V) -> Option Wstawia parę klucz / wartość, jeśli nie ma klucza, zwracany jest None. Po aktualizacji zwracana jest stara wartość. |
2 | len () | pub fn len(&self) -> usize Zwraca liczbę elementów na mapie. |
3 | dostać() | pub fn get<Q: ?Sized>(&lself, k: &Q) -> Option<&V> where K:Borrow Q:Hash+ Eq Zwraca odwołanie do wartości odpowiadającej kluczowi. |
4 | iter () | pub fn iter(&self) -> Iter<K, V> Iterator odwiedzający wszystkie pary klucz-wartość w dowolnej kolejności. Typ elementu iteratora to (& 'a K, &' a V). |
5 | zawiera_klucz | pub fn contains_key<Q: ?Sized>(&self, k: &Q) -> bool Zwraca wartość true, jeśli mapa zawiera wartość dla określonego klucza. |
6 | usunąć() | pub fn remove_entry<Q: ?Sized>(&mut self, k: &Q) -> Option<(K, V)> Usuwa klucz z mapy, zwracając przechowywany klucz i wartość, jeśli klucz był wcześniej w mapie. |
Ilustracja: wstaw ()
Wstawia parę klucz / wartość do HashMap.
use std::collections::HashMap;
fn main(){
let mut stateCodes = HashMap::new();
stateCodes.insert("KL","Kerala");
stateCodes.insert("MH","Maharashtra");
println!("{:?}",stateCodes);
}
Powyższy program tworzy HashMap i inicjalizuje go za pomocą 2 par klucz-wartość.
Wynik
{"KL": "Kerala", "MH": "Maharashtra"}
Ilustracja: len ()
Zwraca liczbę elementów na mapie
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());
}
Powyższy przykład tworzy HashMap i wyświetla całkowitą liczbę zawartych w niej elementów.
Wynik
size of map is 2
Ilustracja - get ()
Zwraca odwołanie do wartości odpowiadającej kluczowi. Poniższy przykład pobiera wartość klucza KL w 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");
}
}
}
Wynik
size of map is 2
{"KL": "Kerala", "MH": "Maharashtra"}
Value for key KL is Kerala
Ilustracja - iter ()
Zwraca iterator zawierający odniesienie do wszystkich par klucz-wartość w dowolnej kolejności.
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);
}
}
Wynik
key: MH val: Maharashtra
key: KL val: Kerala
Ilustracja: zawiera_klucz ()
Zwraca wartość true, jeśli mapa zawiera wartość dla określonego klucza.
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");
}
}
Wynik
found key
Ilustracja: usuń ()
Usuwa klucz z mapy.
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());
}
Wynik
length of the hashmap 3
length of the hashmap after remove() 2
HashSet
HashSet to zestaw unikalnych wartości typu T. Dodawanie i usuwanie wartości jest szybkie i szybko można zapytać, czy dana wartość jest w zestawie, czy nie. Struktura HashSet jest zdefiniowana w module std :: collections. Ten moduł należy jawnie zaimportować, aby uzyskać dostęp do struktury HashSet.
Składnia: tworzenie HashSet
let mut hash_set_name = HashSet::new();
Metoda statyczna nowej struktury HashSet służy do tworzenia HashSet. Ta metoda tworzy pusty zestaw HashSet.
W poniższej tabeli wymieniono niektóre z powszechnie używanych metod struktury HashSet.
Sr.No | metoda | Podpis i opis |
---|---|---|
1 | wstawić() | pub fn insert(&mut self, value: T) -> bool Dodaje wartość do zestawu. Jeśli zestaw nie miał tej wartości, zwracana jest prawda, w przeciwnym razie fałsz. |
2 | len () | pub fn len(&self) -> usize Zwraca liczbę elementów w zestawie. |
3 | dostać() | pub fn get<Q:?Sized>(&self, value: &Q) -> Option<&T> where T: Borrow,Q: Hash + Eq, Zwraca odniesienie do wartości w zestawie, jeśli takie jest, równe podanej wartości. |
4 | iter () | pub fn iter(&self) -> Iter Zwraca iterator odwiedzający wszystkie elementy w dowolnej kolejności. Typ elementu iteratora to & 'a T. |
5 | zawiera_klucz | pub fn contains<Q: ?Sized>(&self, value: &Q) -> bool Zwraca wartość true, jeśli zestaw zawiera wartość. |
6 | usunąć() | pub fn remove<Q: ?Sized>(&mut self, value: &Q) -> bool Usuwa wartość z zestawu. Zwraca wartość true, jeśli wartość była obecna w zestawie. |
Ilustracja - wstaw ()
Dodaje wartość do zestawu. HashSet nie dodaje zduplikowanych wartości do kolekcji.
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);
}
Wynik
{"TutorialsPoint", "Kannan", "Mohtashim"}
Ilustracja: len ()
Zwraca liczbę elementów w zestawie.
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());
}
Wynik
size of the set is 3
Ilustracja - iter ()
Ponownie uruchamia iterator odwiedzający wszystkie elementy w dowolnej kolejności.
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);
}
}
Wynik
TutorialsPoint
Mohtashim
Kannan
Ilustracja: get ()
Zwraca odniesienie do wartości w zestawie, jeśli istnieje, która jest równa podanej wartości.
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);
}
Wynik
found Mohtashim
{"Kannan", "Mohtashim", "TutorialsPoint"}
Ilustracja - zawiera ()
Zwraca wartość true, jeśli zestaw zawiera wartość.
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");
}
}
Wynik
found name
Ilustracja: usuń ()
Usuwa wartość z zestawu.
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());
}
Wynik
length of the Hashset: 3
length of the Hashset after remove() : 2