迭代器这东西C++从11开始也是标准库的一个重要的部分,至于为什么现在语言都设计出了Iterator这个玩意儿而且还很重视这个玩意,以可参考《设计模式》中的迭代器模式来了解使用迭代器的好处,这里之间简单介绍一下Rust的迭代器及其简单的使用。
首先需要说明的是Rust的Iterator是惰性的,所谓惰性就是说在没有调用方法使用迭代器之前它都不会有效果。
基于上面的说明,那么Rust的迭代器主要分为两大类:
- 迭代器适配器:用来产生迭代器的,比如iter(),map(),fliter()等
- 消费适配器器:用来调用迭代器,比如sum(),clollet()等
其次需要认识到Iterator是零成本抽象(没有额外的性能开销)的,在Rust中推荐多使用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的玩家对这个应该不陌生 |
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()
}
}
impl Solution {
pub fn maximum_wealth(accounts: Vec<Vec<i32>>) -> i32 {
accounts.iter().map(|x| x.iter().sum()).max().unwrap()
}
}
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![]
}
}