3 个版本

使用旧的 Rust 2015

0.1.2 2021 年 2 月 12 日
0.1.1 2017 年 9 月 1 日
0.1.0 2017 年 2 月 3 日

#727 in 算法

Download history 279/week @ 2024-03-14 344/week @ 2024-03-21 274/week @ 2024-03-28 358/week @ 2024-04-04 262/week @ 2024-04-11 296/week @ 2024-04-18 269/week @ 2024-04-25 262/week @ 2024-05-02 219/week @ 2024-05-09 254/week @ 2024-05-16 218/week @ 2024-05-23 228/week @ 2024-05-30 191/week @ 2024-06-06 200/week @ 2024-06-13 318/week @ 2024-06-20 291/week @ 2024-06-27

1,060 每月下载量
用于 9 个包 (4 个直接)

MIT/Apache

9KB
73

partition

使用谓词就地对切片进行分区

Build Status License: Apache 2.0/MIT

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

因此可以肯定,性能非常出色。

许可证

根据您的意愿,许可方式如下

无运行时依赖