3 个版本
使用旧的 Rust 2015
0.1.2 | 2021 年 2 月 12 日 |
---|---|
0.1.1 | 2017 年 9 月 1 日 |
0.1.0 | 2017 年 2 月 3 日 |
#727 in 算法
1,060 每月下载量
用于 9 个包 (4 个直接)
9KB
73 行
partition
使用谓词就地对切片进行分区
Rust 有 Iterator::partition(_)
方法,但这种方法需要分配两个 Vec
来存储值。这有利于保持顺序,但以分配时间和内存为代价,这也使得该 API 在没有分配器的系统上不可用。
此包提供了一个 partition(..)
函数,用于通过谓词对可变切片进行分区。它将交换值以分离谓词所持有的值和那些不持有的值,并返回两个可变子切片。
此包还提供了 partition_index(..)
,它的工作方式类似,但返回第一个评估为假的元素的索引。此索引之前的所有元素都评估为真,而此索引之后的所有元素都评估为假。
警告
请注意,由于分区是通过交换值来实现的,因此切片中元素的顺序将不会保持。
示例
let mut even_odd = [0u8, 1, 2, 3, 4, 5, 6];
let (even, odd) = partition(&mut even_odd, |x| x & 1 == 0);
let mut less_than_4 = [0u8, 3, 6, 2, 1, 5, 4];
let idx = partition_index(&mut less_than_4, |x| x < 4);
性能
在具有 4GB 内存的核心 m3-6y30 上,我得到了以下基准测试结果(以 ns/iter 为单位)
元素数量 | partition(&[T], _) |
迭代::partition(_) |
---|---|---|
10000 | 8,738 ± 665 | 101,625 ± 10,930 |
1000 | 896 ± 75 | 6,826 ± 760 |
100 | 118 ± 11 | 1,013 ± 116 |
10 | 14 ± 2 | 295 ± 93 |
1 | 4 ± 1 | 51 ± 7 |
因此可以肯定,性能非常出色。
许可证
根据您的意愿,许可方式如下