使用可变迭代器两次

Use mutable iterator twice

我正在尝试编写一个通用函数,它接受一个可迭代对象(或迭代器)并将其迭代两次,至少一次是可变的,例如:

fn f(iter: I)
where I: Iterator<Item = &mut i32> + Clone {
    for i in iter.clone() {
        println!("{}", *i);
    }

    for i in iter.clone() {
        *i += 1;
    }
}

但它不起作用,因为可变迭代器往往不会实现 clone(),而且出于某些原因。我的真实世界示例是对 HashMap 值的迭代,其中 std::collections::hash_map::ValuesMut 不是克隆。有什么办法吗?

很遗憾,您无法执行此操作。您要么需要将它们合并到一个 for 循环中,要么保存迭代器中的项目以便稍后再次迭代它们。

我能想到的最接近的事情是使用 IntoIterator 来要求参数可以多次用于创建新的迭代器。

pub fn foo<'a, T>(iter: &'a mut T) 
    where for<'b> &'b mut T: IntoIterator<Item=&'a mut i32> {

    for i in iter.into_iter() {
        println!("{}", *i);
    }

    for i in iter.into_iter() {
        *i += 1;
    }
}


let mut map = HashMap::new();
map.insert(2, 5);
map.insert(6, 1);
map.insert(3, 4);
    
foo(&mut map.values_mut())

但是,如果您只传递对整个地图的引用,您似乎就不会那么头疼了。

pub fn bar<T>(map: &mut HashMap<T, i32>) {
    for i in map.values() {
        println!("{}", *i);
    }

    for i in map.values_mut() {
        *i += 1;
    }
}