Rust系列:初步⚙所有权⚙结构体和枚举类⚙函数进阶⚙泛型和特征⚙并发和线程通信
Rust中的动态数组Vec提供了dedup函数,用于删除相邻重复元素。此外,还提供了dedup_by和dedup_by_key,可根据条件删除相邻元素。示例如下
fn main(){
let mut vec = vec![1, 2, 2, 3, 2, 3, 4, 5];
vec.dedup();
println!("vec.dedup()");
for i in vec.iter_mut(){
println!("{}", i);
}
vec.dedup_by(|a,b|{(*a)-(*b)==1});
println!("dedup_by");
for i in vec.iter_mut(){
println!("{}", i);
}
vec.dedup_by_key(|a|{*a>1});
println!("dedup_by_key");
for i in vec.iter_mut(){
println!("{}", i);
}
}
其运行结果如下
vec.dedup()
1 1 1
2 2 2
3 3 3
2 2 2
3 3 3
4 4 4
5 5 5
dedup_by
1 1 1
3 3 3
2 2 2
4 4 4
dedup_by_key
1 1 1
3 3 3
其中,dedup的功能是删除相邻重复元素,这个很容易理解,在输入数组 1 , 2 , 2 , 3 , 2 , 3 , 4 , 5 1,2,2,3,2,3,4,5 1,2,2,3,2,3,4,5中,两个2相邻且重复,所以删除了一个,结果为 1 , 2 , 3 , 2 , 3 , 4 , 5 1,2,3,2,3,4,5 1,2,3,2,3,4,5。
其定义如下
pub fn dedup_by<F>(&mut self, same_bucket: F)
where
F: FnMut(&mut T, &mut T) -> bool,
dedup_by可指定相邻两个元素的关系,如果符合这个关系,那么就删除后面的值。
在示例代码中
vec.dedup_by(|a,b|{(*a)-(*b)==1});
用于判定的函数是|a,b|{*a-*b==1}
,这里有一个稍显诡异的地方,即 a a a表示后面的元素,而 b b b表示前面的元素。那么词判定函数的含义是,当后面的元素比前面的元素大1时,满足要求。对于输入的 1 , 2 , 3 , 2 , 3 , 4 , 5 1,2,3,2,3,4,5 1,2,3,2,3,4,5来说, ( 1 , 2 ) , ( 2 , 3 ) , ( 2 , 3 ) , ( 4 , 5 ) (1,2), (2,3), (2,3), (4,5) (1,2),(2,3),(2,3),(4,5)都满足要求,从而删除后面那个满足要求的值,剩下 1 , 3 , 2 , 4 1,3,2,4 1,3,2,4。
其定义如下
pub fn dedup_by_key<F, K>(&mut self, key: F)
where
F: FnMut(&mut T) -> K,
K: PartialEq<K>,
其功能为,对于相邻且复合条件的元素,仅保留一个值。
在示例代码中,
vec.dedup_by_key(|a|{*a>1});
用于判定的函数是|a|{*a>1}
,即只要大于1就复合要求。而 1 , 3 , 2 , 4 1,3,2,4 1,3,2,4这四个值中, 3 , 2 , 4 3,2,4 3,2,4均符合要求,并且二者相邻,所以只保留一个值,最后输出结果为 1 , 3 1,3 1,3。