MST

星途 面试题库

面试题:Rust自定义迭代器中处理复杂状态与Iterator特型方法的综合应用

假设有一个Rust结构体,它包含两个Vec<i32>类型的成员变量vec1和vec2。请自定义一个迭代器,实现Iterator特型,使得该迭代器能够交替返回vec1和vec2中的元素(先返回vec1的第一个元素,再返回vec2的第一个元素,接着返回vec1的第二个元素,以此类推)。如果其中一个Vec先遍历完,继续遍历另一个Vec。在实现过程中,详细说明如何维护迭代器的状态,以及如何正确实现Iterator特型中的方法,如`next`、`size_hint`等。
22.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
struct AlternateIterator {
    vec1: Vec<i32>,
    vec2: Vec<i32>,
    index1: usize,
    index2: usize,
}

impl AlternateIterator {
    fn new(vec1: Vec<i32>, vec2: Vec<i32>) -> Self {
        AlternateIterator {
            vec1,
            vec2,
            index1: 0,
            index2: 0,
        }
    }
}

impl Iterator for AlternateIterator {
    type Item = i32;

    fn next(&mut self) -> Option<Self::Item> {
        if self.index1 < self.vec1.len() && self.index2 < self.vec2.len() {
            if self.index1 <= self.index2 {
                let result = self.vec1.get(self.index1).cloned();
                self.index1 += 1;
                result
            } else {
                let result = self.vec2.get(self.index2).cloned();
                self.index2 += 1;
                result
            }
        } else if self.index1 < self.vec1.len() {
            let result = self.vec1.get(self.index1).cloned();
            self.index1 += 1;
            result
        } else if self.index2 < self.vec2.len() {
            let result = self.vec2.get(self.index2).cloned();
            self.index2 += 1;
            result
        } else {
            None
        }
    }

    fn size_hint(&self) -> (usize, Option<usize>) {
        let remaining1 = self.vec1.len() - self.index1;
        let remaining2 = self.vec2.len() - self.index2;
        let lower_bound = remaining1.min(remaining2) * 2 + remaining1.max(remaining2);
        (lower_bound, Some(lower_bound))
    }
}

状态维护说明

  1. 成员变量
    • vec1vec2是要迭代的两个Vec<i32>
    • index1index2分别记录vec1vec2当前迭代到的位置。初始化为0。
  2. 迭代逻辑
    • next方法中,首先判断vec1vec2都还有元素时,根据index1index2的大小决定返回vec1还是vec2中的元素,并将对应索引加1。
    • 当其中一个Vec遍历完时,继续遍历另一个Vec

Iterator特型方法实现

  1. next方法
    • 根据当前index1index2的状态,返回vec1vec2中的下一个元素,并更新相应的索引。当两个Vec都遍历完时返回None
  2. size_hint方法
    • 计算并返回剩余元素的下限和上限估计。下限和上限相等,因为我们可以准确知道剩余元素的数量。下限计算为两个Vec中剩余元素较少的那个的两倍加上剩余元素较多的那个的数量。