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。
dedup_by
其定义如下
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。
dedup_by_key
其定义如下
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。