【问题标题】:How to iterate prefixes or suffixes of vec or slice in rust?如何在 rust 中迭代 vec 或 slice 的前缀或后缀?
【发布时间】: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], &[],

【问题讨论】:

    标签: rust iterator slice prefix suffix


    【解决方案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 实现了IteratorDoubleEndedIterator。这允许您使用 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)
    猜你喜欢
    • 2021-10-21
    • 1970-01-01
    • 2010-10-25
    • 2014-04-30
    • 1970-01-01
    • 2016-03-07
    • 2012-11-25
    • 1970-01-01
    相关资源
    最近更新 更多