📅  最后修改于: 2020-11-02 04:20:43             🧑  作者: Mango
Rust的标准集合库提供了最常见的通用编程数据结构的有效实现。本章讨论常用集合的实现-Vector,HashMap和HashSet。
Vector是可调整大小的数组。它将值存储在连续的存储块中。预定义的结构Vec可用于创建矢量。向量的一些重要特征是-
向量可以在运行时增长或收缩。
向量是同构集合。
向量以特定顺序将数据存储为元素序列。向量中的每个元素都分配有唯一的索引号。索引从0开始到n-1,其中n是集合的大小。例如,在5个元素的集合中,第一个元素的索引为0,最后一个元素的索引为4。
向量只会将值附加到末端(或末端附近)。换句话说,向量可用于实现堆栈。
Vector的内存在堆中分配。
let mut instance_name = Vec::new();
Vec结构的静态方法new()用于创建向量实例。
另外,也可以使用vec!创建向量。宏。语法如下所示-
let vector_name = vec![val1,val2,val3]
下表列出了Vec结构的一些常用功能。
Sr.No | Method | Signature & Description |
---|---|---|
1 | new() |
pub fn new()->Vect Constructs a new, empty Vec. The vector will not allocate until elements are pushed onto it. |
2 | push() |
pub fn push(&mut self, value: T) Appends an element to the back of a collection. |
3 | remove() |
pub fn remove(&mut self, index: usize) -> T Removes and returns the element at position index within the vector, shifting all elements after it to the left. |
4 | contains() |
pub fn contains(&self, x: &T) -> bool Returns true if the slice contains an element with the given value. |
5 | len() |
pub fn len(&self) -> usize Returns the number of elements in the vector, also referred to as its ‘length’. |
要创建向量,我们使用静态方法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);
}
上面的示例使用结构Vec中定义的静态方法new()创建一个Vector。 push(val)函数将作为参数传递的值附加到集合中。 len()函数返回向量的长度。
size of vector is :3
[20, 30, 40]
以下代码使用vec创建向量!宏。向量的数据类型被推断为其分配的第一个值。
fn main() {
let v = vec![1,2,3];
println!("{:?}",v);
}
[1, 2, 3]
如前所述,向量只能包含相同数据类型的值。以下代码段将引发错误[E0308]:类型不匹配错误。
fn main() {
let v = vec![1,2,3,"hello"];
println!("{:?}",v);
}
将元素追加到集合的末尾。
fn main() {
let mut v = Vec::new();
v.push(20);
v.push(30);
v.push(40);
println!("{:?}",v);
}
[20, 30, 40]
删除并返回向量中位置索引处的元素,将其后的所有元素向左移动。
fn main() {
let mut v = vec![10,20,30];
v.remove(1);
println!("{:?}",v);
}
[10, 30]
如果切片包含具有给定值的元素,则返回true-
fn main() {
let v = vec![10,20,30];
if v.contains(&10) {
println!("found 10");
}
println!("{:?}",v);
}
found 10
[10, 20, 30]
返回向量中元素的数量,也称为其“长度”。
fn main() {
let v = vec![1,2,3];
println!("size of vector is :{}",v.len());
}
size of vector is :3
向量中的各个元素可以使用其相应的索引号进行访问。以下示例创建了一个矢量广告,其中打印了第一个元素的值。
fn main() {
let mut v = Vec::new();
v.push(20);
v.push(30);
println!("{:?}",v[0]);
}
Output: `20`
向量中的值也可以使用对集合的引用来获取。
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);
}
20
30
40
500
[20, 30, 40, 500]
映射是键值对(称为条目)的集合。映射中的两个条目都不能具有相同的键。简而言之,地图是一个查找表。 HashMap将键和值存储在哈希表中。条目以任意顺序存储。该键用于在HashMap中搜索值。 HashMap结构在std :: collections模块中定义。应该显式导入此模块以访问HashMap结构。
let mut instance_name = HashMap::new();
HashMap结构的静态方法new()用于创建HashMap对象。此方法创建一个空的HashMap。
下面讨论HashMap的常用功能-
Sr.No | Method | Signature & Description |
---|---|---|
1 | insert() |
pub fn insert(&mut self, k: K, v: V) -> Option Inserts a key/value pair, if no key then None is returned. After update, old value is returned. |
2 | len() |
pub fn len(&self) -> usize Returns the number of elements in the map. |
3 | get() |
pub fn get Returns a reference to the value corresponding to the key. |
4 | iter() |
pub fn iter(&self) -> Iter An iterator visiting all key-value pairs in arbitrary order. The iterator element type is (&’a K, &’a V). |
5 | contains_key |
pub fn contains_key Returns true if the map contains a value for the specified key. |
6 | remove() |
pub fn remove_entry Removes a key from the map, returning the stored key and value if the key was previously in the map. |
将键/值对插入到HashMap中。
use std::collections::HashMap;
fn main(){
let mut stateCodes = HashMap::new();
stateCodes.insert("KL","Kerala");
stateCodes.insert("MH","Maharashtra");
println!("{:?}",stateCodes);
}
上面的程序创建一个HashMap并使用2个键值对对其进行初始化。
{"KL": "Kerala", "MH": "Maharashtra"}
返回地图中的元素数
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());
}
上面的示例创建一个HashMap并打印其中的元素总数。
size of map is 2
返回对与键对应的值的引用。下面的示例在HashMap中检索键KL的值。
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");
}
}
}
size of map is 2
{"KL": "Kerala", "MH": "Maharashtra"}
Value for key KL is Kerala
返回一个迭代器,该迭代器以任意顺序包含对所有键值对的引用。
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);
}
}
key: MH val: Maharashtra
key: KL val: Kerala
如果映射包含指定键的值,则返回true。
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");
}
}
found key
从地图上删除一个键。
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());
}
length of the hashmap 3
length of the hashmap after remove() 2
HashSet是一组类型为T的唯一值。添加和删除值很快,并且快速询问给定值是否在集合中也很快。 HashSet结构在std :: collections模块中定义。应该显式导入此模块以访问HashSet结构。
let mut hash_set_name = HashSet::new();
HashSet结构的静态方法new用来创建HashSet。此方法创建一个空的HashSet。
下表列出了HashSet结构的一些常用方法。
Sr.No | Method | Signature & Description |
---|---|---|
1 | insert() |
pub fn insert(&mut self, value: T) -> bool Adds a value to the set. If the set did not have this value present, true is returned else false. |
2 | len() |
pub fn len(&self) -> usize Returns the number of elements in the set. |
3 | get() |
pub fn get Returns a reference to the value in the set, if any that is equal to the given value. |
4 | iter() |
pub fn iter(&self) -> Iter Returns an iterator visiting all elements in arbitrary order. The iterator element type is &’a T. |
5 | contains_key |
pub fn contains Returns true if the set contains a value. |
6 | remove() |
pub fn remove Removes a value from the set. Returns true if the value was present in the set. |
向集合中添加一个值。 HashSet不会将重复值添加到集合中。
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);
}
{"TutorialsPoint", "Kannan", "Mohtashim"}
返回集合中的元素数。
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());
}
size of the set is 3
强制以任意顺序访问所有元素的迭代器。
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);
}
}
TutorialsPoint
Mohtashim
Kannan
返回对该集合中的值的引用(如果有),该引用等于给定值。
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);
}
found Mohtashim
{"Kannan", "Mohtashim", "TutorialsPoint"}
如果集合包含一个值,则返回true。
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");
}
}
found name
从集合中删除一个值。
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());
}
length of the Hashset: 3
length of the Hashset after remove() : 2