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 · Rust 包仓库 279/week @ 2024-03-14 · Rust 包仓库 344/week @ 2024-03-21 · Rust 包仓库 274/week @ 2024-03-28 · Rust 包仓库 358/week @ 2024-04-04 · Rust 包仓库 262/week @ 2024-04-11 · Rust 包仓库 296/week @ 2024-04-18 · Rust 包仓库 269/week @ 2024-04-25 · Rust 包仓库 262/week @ 2024-05-02 · Rust 包仓库 219/week @ 2024-05-09 · Rust 包仓库 254/week @ 2024-05-16 · Rust 包仓库 218/week @ 2024-05-23 · Rust 包仓库 228/week @ 2024-05-30 · Rust 包仓库 191/week @ 2024-06-06 · Rust 包仓库 200/week @ 2024-06-13 · Rust 包仓库 318/week @ 2024-06-20 · Rust 包仓库 291/week @ 2024-06-27 · Rust 包仓库

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

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

许可证

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

无运行时依赖