Rust迭代器简介
admin
2024-02-14 19:21:53

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) -> Vec {a.iter().scan(0, |res, &i| {*res = (2 * *res + i) % 5;Some(*res == 0)}).collect()}
}

2.leetcode 721

impl Solution {pub fn maximum_wealth(accounts: Vec>) -> i32 {accounts.iter().map(|x| x.iter().sum()).max().unwrap()}
}

3.leetcode 1

use std::collections::HashMap;
impl Solution {pub fn two_sum(nums: Vec, target: i32) -> Vec {let mut map: HashMap = 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![]}
}

相关内容

热门资讯

山水皆有情!丽江两山一江的千年... 去过丽江、走过虎跳峡的人,大概率都听过哈巴雪山和金沙江的传说。很多人站在峡谷之下,望着奔腾不息的金沙...
活力中国调研行丨“殷”你而来 ... 9月12日,游客在殷墟博物馆“甲骨文展厅”内参观。位于河南省安阳市的殷墟博物馆新馆是首个全景式展现商...
浦江之夜赴美好相逢,第37届上... 9月12日晚,黄浦江畔灯火璀璨,第37届上海旅游节大巡游在外滩中山东一路上演。不少观众早早便来到外滩...
美丽中国丨秋韵紫鹊界 梯田入画... 这是9月11日拍摄的紫鹊界梯田(无人机照片)。 金秋九月,湖南省娄底市新化县紫鹊界梯田稻谷渐次成熟。...
中国之巅奏响《共同的节日》,千... 千吨阻尼器,“迎世赛、游上海旅游节”。9月13日,由上海市文化和旅游局指导推出上海旅游·会客│巅峰之...