如何在 rust 中迭代 vec 或 slice 的前缀或后缀?
How to iterate prefixes or suffixes of vec or slice in rust?
我有一个向量: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], &[],
另请参阅:
适用于 &[T]
(即切片)的内容也适用于 &Vec<T>
,因为 Deref coercion
构建从0到slice.len()的索引范围:0..=slice.len()
std::ops::Range 实现两者 Iterator and 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()
}
我有一个向量: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], &[],
另请参阅:
适用于
&[T]
(即切片)的内容也适用于&Vec<T>
,因为 Deref coercion构建从0到slice.len()的索引范围:
0..=slice.len()
std::ops::Range 实现两者 Iterator and 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()
}