4 个版本 (2 个重大更新)
0.4.1 | 2023年2月22日 |
---|---|
0.4.0 | 2021年11月24日 |
0.3.0 | 2021年11月17日 |
0.2.1 | 2021年7月27日 |
#639 在 数据结构 中
每月510 次下载
在 5 个crate中使用 (2个直接使用)
24KB
332 行
arbitrary-chunks
一个迭代器,允许指定一个输入数组,该数组包含任意块大小,可以用来分割向量或数组。与标准的 .chunks()
相似,此迭代器也包括 _mut()
,_exact()
和 _exact_mut()
变体。
使用方法
默认情况下,此迭代器为 [T]
实现,这意味着它适用于任何类型的数组和Vec。
如果没有足够的数据来满足提供的块长度,你将得到该块的所有剩余数据,因此它将比预期更短。要停止早期,如果没有足够的数据,请参阅 .arbitrary_chunks_exact()
变体。
use arbitrary_chunks::ArbitraryChunks;
let chunks: Vec<usize> = vec![1, 3, 1];
let data: Vec<i32> = vec![0, 1, 2, 3, 4];
let chunked_data: Vec<Vec<i32>> = data
.arbitrary_chunks(&chunks)
.map(|chunk| chunk.to_vec())
.collect();
assert_eq!(vec![0], chunked_data[0]);
assert_eq!(vec![1, 2, 3], chunked_data[1]);
assert_eq!(vec![4], chunked_data[2]);
精确变体
与常规变体不同,精确变体的迭代器将在没有足够的数据来满足块时提前结束。相反,你将能够使用 .remainder()
访问数据的剩余部分。
use arbitrary_chunks::ArbitraryChunks;
let chunks: Vec<usize> = vec![1, 3];
let data: Vec<i32> = vec![0, 1, 2];
let mut iter = data.arbitrary_chunks_exact(&chunks);
assert_eq!(vec![0], iter.next().unwrap());
assert_eq!(None, iter.next());
assert_eq!(vec![1, 2], iter.remainder());
可变变体
常规和精确变体各自也有自己的可变变体。这些允许你在任意大小的块中对切片和向量进行可变修改。
use arbitrary_chunks::ArbitraryChunks;
let chunks: Vec<usize> = vec![1, 3, 1];
let data: Vec<i32> = vec![0, 1, 2, 3, 4];
let iter_1 = data.arbitrary_chunks_mut(&chunks);
let iter_2 = data.arbitrary_chunks_exact_mut(&chunks);
并行迭代器
可以使用 .par_bridge()
与rayon并行使用,例如
use arbitrary_chunks::ArbitraryChunks;
use rayon::prelude::*;
let chunks: Vec<usize> = vec![1, 3, 1];
let data: Vec<i32> = vec![0, 1, 2, 3, 4];
data
.arbitrary_chunks(&chunks)
.par_bridge()
.for_each(|chunk| {
assert!(chunk.len() >= 1 && chunk.len() <= 3);
println!("{:?}", chunk);
});
// Prints (in pseudo-random order):
// [1, 2, 3]
// [0]
// [4]
动机
这个库是由需要同时可变修改同一切片的多个部分的需求所启发的。使用这个库加上Rayon,你能够安全地从多个线程同时可变借用和修改切片,而不会打扰借用检查器。
许可证
根据以下之一许可:
- Apache许可证,版本2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则任何根据Apache-2.0许可证定义的、您有意提交以包含在作品中的贡献,将如上双许可,不附加任何额外条款或条件。