rust学习笔记18-迭代器

迭代器是处理集合数据的重要工具,Rust 的迭代器提供了一种高效、灵活的方式来处理集合数据。

1.创建迭代器

iter():生成元素的不可变引用(&T),不转移所有权。

into_iter():转移所有权,遍历后原集合不可再用。

iter_mut():生成元素的可变引用(&mut T),允许修改元素。

rust 复制代码
fn main() {
    let v = vec![1, 2, 3, 4, 5];
    let i = v.iter();
    let sum:i32 = i.sum();
    println!("{}", sum);
    // 使用iter创建迭代器,所有权不会转移
    println!("{:?}", v);
    
    let mut v2 = vec![1, 2, 3, 4, 5];
    // 使用iter_mut 可以修改集合元素值
    for i in v2.iter_mut(){
        *i += 2;
    }
    println!("{:?}", v2);

    let v3 = vec![1, 2, 3, 4, 5];
    let s2 = v3.into_iter();
    let sum2:i32 = s2.sum();
    println!("{}", sum2);
    // 使用into_iter创建迭代器,所有转移转移v3无法再使用
    println!("{:?}", v3);
}

2.迭代器特性

惰性求值:适配器(如 map、filter)不会立即执行,需通过消耗器(如 collect、sum)触发计算。

rust 复制代码
fn main() {
    let numbers = vec![1, 2, 3, 4, 5];

    let n1: Vec<_> = numbers.iter()
        .map(|x| x * 2)
        .filter(|&x| x > 5)
        .collect();
    
    println!("{:?}", n1); 
}

3.常用适配器

map:对每个元素进行转换。

filter:保留满足条件的元素。

take_while / skip_while:基于条件提前终止或跳过。

zip:合并两个迭代器,生成元组。

enumerate:添加索引,生成 (usize, T)。

4.消耗器

collect:收集为集合。

fold:累积计算。

sum / count:求和或计数。

all / any:检查所有或任意元素满足条件。

rust 复制代码
fn main() {
    let v = vec![1, 2, 3, 4, 5];
    let result: Vec<_> = v.iter()
    .enumerate()
    .filter(|(i, &x)| i % 2 == 0)
    .map(|(i, x)| x * 2)
    .collect();

    println!("{:?}", result);
    let sum = v.iter().fold(0, |acc, &x| acc + x); // 求和

    println!("{}", sum);
}

5.错误处理

使用 Result 时,collect 可汇总结果:

rust 复制代码
fn main() {
    let results: Vec<Result<i32, &str>> = vec![Ok(1), Err("error"), Ok(3)];
    let res: Result<Vec<_>, _> = results.into_iter().collect(); // 遇到第一个 Err 停止
    match res {
        Ok(l) => println!("res: {:?}", l),
        Err(e) => eprintln!("Error reading res: {}", e),
    }
   
}

总结 Rust 迭代器通过链式调用和惰性求值,提供了高效的声明式编程方式。掌握常用适配器和消耗器,能够编写简洁且高性能的代码。大力推荐使用。

相关推荐
梅见十柒5 分钟前
UNIX网络编程笔记:高级套接字编程20-25
网络·经验分享·笔记·unix
XZSSWJS30 分钟前
机器视觉学习-day03-灰度化实验-二值化和自适应二值化
人工智能·学习·计算机视觉
爱隐身的官人5 小时前
爬虫基础学习-链接协议分析,熟悉相关函数
爬虫·学习
red_redemption10 小时前
自由学习记录(88)
学习
百分百题库APP14 小时前
江苏安全员 A 证 “安全生产管理” 核心考点
学习·考试·题库·考证
hello_ world.15 小时前
k8s笔记04-常用部署命令
笔记·容器·kubernetes
SatoshiGogo16 小时前
《李沐读论文》系列笔记:论文读写与研究方法【更新中】
笔记
IT199516 小时前
Wireshark笔记-DHCP流程与数据包解析
笔记·测试工具·wireshark
子朔不言16 小时前
[MH22D3开发笔记]2. SPI,QSPI速度究竟能跑多快,双屏系统的理想选择
笔记·mh22d3·新龙微·兆讯·双屏
被遗忘的旋律.16 小时前
Linux驱动开发笔记(七)——并发与竞争(上)——原子操作
linux·驱动开发·笔记