• Rust迭代器简介


    Rust迭代器简介

    迭代器这东西C++从11开始也是标准库的一个重要的部分,至于为什么现在语言都设计出了Iterator这个玩意儿而且还很重视这个玩意,以可参考《设计模式》中的迭代器模式来了解使用迭代器的好处,这里之间简单介绍一下Rust的迭代器及其简单的使用。

    基本认知

    1. 首先需要说明的是Rust的Iterator是惰性的,所谓惰性就是说在没有调用方法使用迭代器之前它都不会有效果。

      基于上面的说明,那么Rust的迭代器主要分为两大类:

      1. 迭代器适配器:用来产生迭代器的,比如iter(),map(),fliter()等
      2. 消费适配器器:用来调用迭代器,比如sum(),clollet()等
    2. 其次需要认识到Iterator是零成本抽象(没有额外的性能开销)的,在Rust中推荐多使用Iterator,而且常常是和闭包一起使用的。

    常使用有关Iterator的内容

    说明:以下是常用API,关于怎么生成迭代器,以及迭代器是不是引用的或者可变的等不是本节内容,不展开介绍。

    方法名作用
    iter()从一个集合(&T)中创建迭代器。
    iter_mut()从一个集合(&mut T)中创建一个迭代器
    into_iter()从一个集合(T)中创建一个迭代器
    next()获取集合的下一个迭代器
    sum()对迭代器求和
    collect()将迭代器转化为指定的迭代器类型
    map()根据闭包生成新的迭代器,常与collect()一起使用
    fliter()收集符合条件的迭代器,常与collect()一起使用
    rev()反转迭代器
    zip()将两个迭代器压缩为一个迭代器
    any()判断迭代器是否满足某个条件
    fold()类似C++的accumlate
    scan()类似fold,提供了更加精细的控制力度
    enumrate()这个主要是产生迭代次数,熟悉python的玩家对这个应该不陌生

    一些使用迭代器的例子

    1. leetcode 1018

    impl Solution {
        pub fn prefixes_div_by5(a: Vec<i32>) -> Vec<bool> {
            a.iter().scan(0, |res, &i| {
                    *res = (2 * *res + i) % 5;
                    Some(*res == 0)
                })
                .collect()
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.leetcode 721

    impl Solution {
        pub fn maximum_wealth(accounts: Vec<Vec<i32>>) -> i32 {
            accounts.iter().map(|x| x.iter().sum()).max().unwrap()
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.leetcode 1

    use std::collections::HashMap;
    impl Solution {
        pub fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
            let mut map: HashMap<i32, i32> = HashMap::new();
            for (idx, n) in nums.iter().enumerate() {
                match map.get(&(target - *n)) {
                    Some(&v) => return vec![v, idx as i32],
                    None => map.insert(*n, idx as i32),
                };
            }
            vec![]
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    Jenkins 执行job通知飞书机器人
    C++ 11的移动语义 - 清晰的示例及浅显的说理
    基于安卓android微信小程序的旅游app系统
    GCC Rust获批将被纳入主线代码库,或将于GCC 13中与大家见面
    文件下载Blob
    vue中使用MINIO将文件上传到指定的bucket库中(vue2和vue3)
    【vue+element ui】大屏自适应中el-select下拉内容在低分辨率下显示不全问题解决
    天龙八部TLBB系列 - 关于技能冷却和攻击范围数量的问题
    Java —— 运算符
    sql添加索引
  • 原文地址:https://blog.csdn.net/weixin_45730130/article/details/128041470