附加 集合数据_Rust 学习笔记-16 集合(Collections)

本文是Rust学习笔记,介绍了标准集合库中的Vector、HashMap和HashSet的使用,包括创建、操作和访问方法,展示了各种方法的示例和输出。
摘要由CSDN通过智能技术生成

Rust 学习笔记-16 集合(Collections)

2b39910e0f59d26bfeefdbca92d67f2b.png

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 被填充了数据.
  • 2 push()
    • pub fn push(&mut self, value: T)
      • 添加一个元素到末尾。
  • 3 remove()
    • pub fn remove(&mut self, index: usize) -> T
      • 移除并返回位于Vector内索引位置的元素,将其后面的所有元素向左移动
  • 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
8e0145242a88f2f8fdedabde8d519ccc.png

往期回顾:

头条不好的地方是连续引用链接不能自动换行. 经常引用站内文章提示我有外链. 没办法用.

查看往期请关注我: 点击我的头像.

appr_dbscan_rust-master是一个基于Rust语言实现的DBSCAN算法的库。DBSCAN全称是Density-Based Spatial Clustering of Applications with Noise,是一种常用的密度聚类算法,能够根据样本点的密度将数据划分为多个类别,并找出离群点。 app_dbscan_rust-master库提供了一个高效的Rust实现,可以用来处理大规模数据集。它主要包含如下几个部分: 1. 数据结构:库提供了适合聚类算法使用的数据结构,如点(Point)、数据集(Dataset)等。这些数据结构可以方便地存储和处理数据。 2. 距离计算:库实现了多种距离计算的方法,例如欧几里得距离、曼哈顿距离等,用于评估样本点之间的相似度。 3. DBSCAN算法:库实现了DBSCAN算法的核心逻辑。DBSCAN通过定义邻域范围和密度阈值来判断样本点的分类,具有较好的鲁棒性和扩展性。 4. 聚类结果:经过DBSCAN算法处理后,库能够将数据集中的样本点进行聚类,并输出聚类结果。聚类结果可以帮助我们发现数据集中存在的簇以及离群点。 使用app_dbscan_rust-master库可以方便地进行DBSCAN聚类分析。首先,我们需要导入库,并准备好需要聚类的数据集。然后,根据数据集的特点选择适合的距离计算方法和参数设置。最后,调用库中的DBSCAN算法函数,即可得到聚类结果。 总之,app_dbscan_rust-master是一个基于Rust语言实现的DBSCAN聚类算法库。它提供了高效的算法实现和方便的使用接口,可以帮助我们在大规模数据集上进行聚类分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值