为什么在向量上调用filter不会从向量中删除元素? [英] Why does calling filter on a vector not remove elements from the vector?

查看:68
本文介绍了为什么在向量上调用filter不会从向量中删除元素?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一个寻找马拉松冠军的小程序. 一切似乎都是合乎逻辑的,直到我尝试过滤延迟了一段时间的跑步者的向量.过滤器函数后,向量保持不变,如果使用iter_mut(),则指出类型错误.

I am writing a small program that finds a winner of a marathon. Everything seems logical until I try to filter the vector for runners that are late for some amount of time. The vector remains same after the filter function, and if use iter_mut() it states type errors.

fn main() {
    let mut input_line = String::new();
    std::io::stdin().read_line(&mut input_line);
    let n = input_line.trim().parse::<u8>().unwrap();
    let mut v = Vec::with_capacity(n as usize);
    for _ in 0..n {
        let mut input_line = String::new();
        std::io::stdin().read_line(&mut input_line);
        let separated = input_line.trim().split(":").collect::<Vec<_>>();
        let hours = separated[0].parse::<u8>().unwrap();
        let minutes = separated[1].parse::<u8>().unwrap();
        let seconds = separated[2].parse::<u8>().unwrap();
        v.push((hours, minutes, seconds));
    }

    //println!("{:?}", v);
    filter_hours(&mut v);
    filter_minutes(&mut v);
    filter_seconds(&mut v);
    println!("{:?}", v[0]);

    println!("{:?}", v);
}

fn filter_hours(v: &mut Vec<(u8, u8, u8)>) {
    let (mut minimum, _, _) = v[0];
    for &i in v.iter() {
        let (h, _, _) = i;
        if h < minimum {
            minimum = h;
        }
    }
    v.iter().filter(|&&(h, _, _)| h == minimum);
}

fn filter_minutes(v: &mut Vec<(u8, u8, u8)>) {
    let (_, mut minimum, _) = v[0];
    for &i in v.iter() {
        let (_, m, _) = i;
        if m < minimum {
            minimum = m;
        }
    }
    v.iter().filter(|&&(_, m, _)| m == minimum);
}

fn filter_seconds(v: &mut Vec<(u8, u8, u8)>) {
    let (_, _, mut minimum) = v[0];
    for &i in v.iter() {
        let (_, _, s) = i;
        if s < minimum {
            minimum = s;
        }
    }
    v.iter().filter(|&&(_, _, s)| s == minimum);
}

推荐答案

迭代器不会更改原始数据结构中的项数.相反,您要使用 retain :

Iterators do not alter the number of items in the original data structure. Instead, you want to use retain:

fn filter_hours(v: &mut Vec<(u8, u8, u8)>) {
    let min = v.iter().map(|&(h, _, _)| h).min().unwrap();
    v.retain(|&(h, _, _)| h == min);
}

这篇关于为什么在向量上调用filter不会从向量中删除元素?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆