Rust 学习笔记-16 集合(Collections)
Rust的标准集合库提供了最常见的通用编程数据结构的有效实现。
本节学习常用集合Vector、HashMap和HashSet的实现。
向量(Vector)
向量是可调整大小的数组。它将值存储在连续的内存块中。预定义的结构Vec可用于创建向量。向量的一些重要特征是:
- 向量(Vector)可以在运行时增长或收缩。
- 向量(Vector)是相同数据类型的集合。
- 向量(Vector)以特定顺序将数据存储为元素序列。向量中的每个元素都有一个唯一的索引号。索引从0开始,一直到n-1,其中n是集合的大小。例如,在5个元素的集合中,第一个元素将位于索引0,最后一个元素将位于索引4。
- 向量(Vector)只会将值附加到(或接近)结尾。换句话说,向量可以用来实现堆栈。
- 向量(Vector)的内存在堆中分配
语法:
创建一个Vector
let mut instance_name = Vec::new();
Vec 的静态方法new()用于创建向量实例。或者,也可以使用vec创建一个Vec!宏。
语法如下所示-
let vector_name = vec![val1,val2,val3]
Vector 部分方法一览:
- 1. new()
- pub fn new()
- 创建一个新的,空的vector, 并不分配空间,直到vector 被填充了数据.
- pub fn new()
- 2 push()
- pub fn push(&mut self, value: T)
- 添加一个元素到末尾。
- pub fn push(&mut self, value: T)
- 3 remove()
- pub fn remove(&mut self, index: usize) -> T
- 移除并返回位于Vector内索引位置的元素,将其后面的所有元素向左移动
- pub fn remove(&mut self, index: usize) -> T
- 4 contains()
- pub fn contains(&self, x: &T) -> bool
- 如果切片包含具有给定值的元素,则返回true
- 5 len()
- pub fn len(&self) -> usize
- 返回vector 元素个数, 也就是长度.
创建一个Vector -- 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的作用是:返回Vector的长度
输出:
size of vector is :3[20, 30, 40]
创建一个Vector - vec! 宏
下面的代码使用vec 创建一个Vec!宏。Vector的数据类型是从分配给它的第一个值推断出来的。
fn main() { let v = vec![1,2,3]; println!("{:?}",v);}
输出:
[1, 2, 3]
如前所述,Vector 只能包含相同数据类型的值。
以下代码段将引发错误[E0308]:类型不匹配错误。
fn main() { let v = vec![1,2,3,"hello"]; println!("{:?}",v);}
push() 方法
如第一个例子. 添加一个元素到末尾.
fn main() { let mut v = Vec::new(); v.push(20); v.push(30); v.push(40); println!("{:?}",v);}
remove() 方法:
移除并返回位于向量内索引位置的元素,将其后面的所有元素向左移动.
fn main() { let mut v = vec![10,20,30]; v.remove(1); // 指定索引. println!("{:?}",v);}
输出:
[10, 30]
contains() 方法
如果切片包含具有给定值的元素-,则返回true
fn main() { let v = vec![10,20,30]; if v.contains(&10) { println!("found 10"); } println!("{:?}",v);}
输出:
found 10[10, 20, 30]
len() 方法:
返回Vector中的元素个数,也称为“长度”
fn main() { let v = vec![1,2,3]; println!("size of vector is :{}",v.len());}
输出:size of vector is :3
访问向量的值
Vector中的单个元素可以使用它们对应的索引号进行访问。
下面的示例创建一个Vector ad,打印第一个元素的值
fn main() { let mut v = Vec::new(); v.push(20); v.push(30); println!("{:?}",v[0]);}
输出:
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);}
输出:
203040500[20, 30, 40, 500]
HashMap
Map 是键值对(称为条目)的集合。映射中没有两个条目可以具有相同的键。简而言之,Map就是一个查找表。HashMap将键和值存储在哈希表中。条目以任意顺序存储。Key 用于搜索HashMap中的值。HashMap结构在std::collections模块中定义。应该显式地导入这个模块来访问HashMap结构.
语法: 创建一个HashMap.
let mut instance_name = HashMap::new();
HashMap支持的方法:
- insert()
- pub fn insert(&mut self, k: K, v: V) -> Option
- 插入一个键/值对, 如果key不存在,返回None, 如果发生更新,返回原来旧的值
- len()
- pub fn len(&self) -> usize
- 返回Map里面的元素个数. 我
- get()
- pub fn get(&lself, k: &Q) -> Option where K:Borrow Q:Hash+ Eq
-
- 返回对与键对应的值的引用
- 4 iter()
- pub fn iter(&self) -> Iter
- 任意顺序访问所有键值对的迭代器。迭代器元素类型是(&'ak,&'av)
- contains_key
- pub fn contains_key(&self, k: &Q) -> bool
- 返回是否包含这个元素/.
- remove()
- pub fn remove_entry(&mut self, k: &Q) -> Option
- 从映射中移除键(Key),如果该键之前在映射中,则返回存储的键和值。
insert() & len() 方法.
插入键值对到HashMap.
use std::collections::HashMap;fn main(){ let mut stateCodes = HashMap::new(); stateCodes.insert("KL","Kerala"); stateCodes.insert("MH","Maharashtra"); println!("{:?}",stateCodes); println!("size of map is {}",stateCodes.len());}
输出:
{"KL": "Kerala", "MH": "Maharashtra"}size of map is 2
get() 方法:
返回对与键对应的值的引用。下面的示例检索HashMap中key 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
iter() 方法:
返回一个迭代器,该迭代器包含以任意顺序对所有键值对的引用
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: Maharashtrakey: KL val: Kerala
contains_key()
如果映射包含指定键的值,则返回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
remove() 方法:
从Map中删除关键点。
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 3length of the hashmap after remove() 2
HashSet
HashSet是一组类型为T的唯一值。添加和删除值很快,而且查询给定值是否在该集中也很快。HashSet结构在std::collections模块中定义。应该显式地导入这个模块来访问HashSet结构。
语法: 创建一个HashSet.
let mut hash_set_name = HashSet::new();
HashSet 支持部分方法如下:
- insert()
- pub fn insert(&mut self, value: T) -> bool
- 向集合添加值。如果集合中不存在此值,则返回true,否则返回false
- len()
- pub fn len(&self) -> usize
- 返回元素个数.
- get()
- pub fn get(&self, value: &Q) -> Option where T: Borrow,Q: Hash + Eq
- 如果有与给定值相等的值,则返回对集合中值的引用.
- iter()
- pub fn iter(&self) -> Iter
- 返回以任意顺序访问所有元素的迭代器。迭代器元素类型是&'aT.
- contains_key
- pub fn contains(&self, value: &Q) -> bool
- 如果集合包含值,则返回true
- remove()
- pub fn remove(&mut self, value: &Q) -> bool
- 从集合中移除值。如果集合中存在该值,则返回true
insert() & len() 方法:
向集合添加值。哈希集不会向集合添加重复值
use std::collections::HashSet;fn main() { let mut names = HashSet::new(); names.insert("Mohtashim"); names.insert("Kannan"); names.insert("TomsBrand"); names.insert("Mohtashim");// 重复值不会添加. println!("{:?}",names); println!("size of the set is {}",names.len());}
输出:
{"Mohtashim", "Kannan", "TomsBrand"}size of the set is 3
iter() 方法.
迭代器与hashmap差不多.不赘述.
get() 方法:
use std::collections::HashSet;fn main() { let mut names = HashSet::new(); names.insert("Mohtashim"); names.insert("Kannan"); names.insert("TomsBrand"); names.insert("Mohtashim"); match names.get(&"Mohtashim") { Some(value) => { println!("found {}", value); } None => { println!("not found"); } } println!("{:?}", names);}
输出:
found Mohtashim{"Mohtashim", "Kannan", "TomsBrand"}
contains() 方法:
与hashmap一样.
remove 方法:
use std::collections::HashSet;fn main() { let mut names = HashSet::new(); names.insert("Mohtashim"); names.insert("Kannan"); names.insert("TomsBrand"); println!("length of the Hashset: {}", names.len()); names.remove(&"Kannan"); println!("length of the Hashset after remove() : {}", names.len());}
输出:
length of the Hashset: 3length of the Hashset after remove() : 2
往期回顾:
头条不好的地方是连续引用链接不能自动换行. 经常引用站内文章提示我有外链. 没办法用.
查看往期请关注我: 点击我的头像.