如何在 rust 中迭代 vec 或 slice 的前缀或后缀?

Posted

技术标签:

【中文标题】如何在 rust 中迭代 vec 或 slice 的前缀或后缀?【英文标题】:How to iterate prefixes or suffixes of vec or slice in rust? 【发布时间】:2021-10-20 13:36:39 【问题描述】:

我有一个 vec:vec![1, 2, 3, 4]。我想知道如何:

从最短到最长迭代它的前缀:

&[], &[1], &[1, 2], &[1, 2, 3], &[1, 2, 3, 4]

从最长到最短迭代它的前缀:

&[1, 2, 3, 4], &[1, 2, 3], &[1, 2], &[1], &[]

从最短到最长迭代其后缀:

&[], &[4], &[3, 4], &[2, 3, 4], &[1, 2, 3, 4]

从最长到最短迭代其后缀:

&[1, 2, 3, 4], &[2, 3, 4], &[3, 4], &[4], &[],

【问题讨论】:

【参考方案1】:

另请参阅:How to iterate prefixes and suffixes of str or String in rust?

由于Deref coercion,适用于&[T](即切片)的方法也适用于&Vec<T>

构建从 0 到 slice.len() 的索引范围:0..=slice.len()

std::ops::Range 实现了Iterator 和DoubleEndedIterator。这允许您使用 rev() 方法:

(0..=slice.len()).rev()

获取给定长度的前缀:&slice[..len]

要获得没有第一个 cut 项的后缀:&slice[cut..]

把它们放在一起

从最短到最长迭代:

pub fn prefixes_asc<T>(slice: &[T]) -> impl Iterator<Item = &[T]> + DoubleEndedIterator 
    (0..=slice.len()).map(move |len| &slice[..len])


pub fn suffixes_asc<T>(slice: &[T]) -> impl Iterator<Item = &[T]> + DoubleEndedIterator 
    (0..=slice.len()).rev().map(move |cut| &slice[cut..])

要反转只需使用 .rev():

pub fn prefixes_desc<T>(slice: &[T]) -> impl Iterator<Item = &[T]> + DoubleEndedIterator 
    prefixes_asc(slice).rev()


pub fn suffixes_desc<T>(slice: &[T]) -> impl Iterator<Item = &[T]> + DoubleEndedIterator 
    suffixes_asc(slice).rev()

tests

【讨论】:

您也可以从两个“升序”函数返回impl Iterator&lt;Item = &amp;[T]&gt; + DoubleEndedIterator,并在其各自的“降序”函数中调用.rev(),以避免重复(此时,具有“降序”版本不再有意义,因为调用者也可以调用.rev)

以上是关于如何在 rust 中迭代 vec 或 slice 的前缀或后缀?的主要内容,如果未能解决你的问题,请参考以下文章

迭代Rust Vec的首选方法?

rust - 如何在Vec上更新或插入?

如何迭代 Rust 中序列的所有唯一排列?

如何在rust中迭代str或String的前缀和后缀?

如何在Rust中修改向量的元素?

如何将嵌套 Vecs 与 wasm-bindgen 一起使用?