如何在 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<Item = &[T]> + DoubleEndedIterator
,并在其各自的“降序”函数中调用.rev()
,以避免重复(此时,具有“降序”版本不再有意义,因为调用者也可以调用.rev
)以上是关于如何在 rust 中迭代 vec 或 slice 的前缀或后缀?的主要内容,如果未能解决你的问题,请参考以下文章