#iterator #chunk

arbitrary-chunks

一个迭代器,允许指定一个输入数组,该数组包含任意块大小,可以用来分割向量或数组

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数据结构

Download history 155/week @ 2024-03-12 214/week @ 2024-03-19 158/week @ 2024-03-26 263/week @ 2024-04-02 161/week @ 2024-04-09 143/week @ 2024-04-16 162/week @ 2024-04-23 181/week @ 2024-04-30 153/week @ 2024-05-07 73/week @ 2024-05-14 142/week @ 2024-05-21 141/week @ 2024-05-28 142/week @ 2024-06-04 94/week @ 2024-06-11 176/week @ 2024-06-18 80/week @ 2024-06-25

每月510 次下载
5 个crate中使用 (2个直接使用)

Apache-2.0 OR MIT

24KB
332

arbitrary-chunks

Crates.io Crates.io

一个迭代器,允许指定一个输入数组,该数组包含任意块大小,可以用来分割向量或数组。与标准的 .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许可证定义的、您有意提交以包含在作品中的贡献,将如上双许可,不附加任何额外条款或条件。

无运行时依赖