🎈
快乐笔记 HappyNotes-综合基础科学学习笔记集
  • 前言
  • 计算机
    • 语言
      • 汇编
        • 基础
          • 概念
          • 指令集
        • x86
        • amd64
      • C
      • C++
      • Rust
        • 基础
          • 语法
            • 函数
            • 字面量
            • 流程控制
            • 闭包
            • 静态变量
            • 迭代器
            • 运算符
            • Result枚举
            • Option枚举
            • Page 17
            • Page 16
            • Page 9
          • 指针
          • 进程
          • 内存
          • 指针
          • 网络
          • 数学运算
          • 环境与配置
          • 工程组织管理
          • WASM
          • IO
          • FFI
            • 基础
            • 库
            • cbindgen
        • 标准库
      • Java
        • JDK
          • JUC
            • 基础
              • 基础
              • 相关链接
            • 集合
              • ConcurrentHashMap
              • 基础
      • Solidity
        • 基础
          • EIP标准
          • 可升级合约
          • 变量
          • 存储位置
          • 常量
        • 框架
          • OpenZeppelin
            • 基础
            • API
            • 常用操作
            • Page 19
          • UniSwap
          • PancakeSwap
        • 工具链
          • Hardhat
          • Truffle
        • IDE
          • Remix
      • Go
      • Javascript
      • Typrscript
      • Zig
      • Python
      • SQL
      • Lisp
      • 脚本
        • 正则表达式
        • bat
        • markdown
        • shell
        • toml
        • yaml
    • OS
      • 基础
        • 空间
      • Linux
        • 基础
        • 内核
        • 命名空间
        • 文件系统
        • 命令
        • 进程系统
        • 工具
        • 三方版本
          • Kali
            • metasploit
          • Ubantu
      • MacOS
      • Windows
      • 工具
        • make
        • netcat
    • 存储
      • 搜索引擎
        • OpenSearch
        • ZincSearch
      • 存储系统
        • IPFS
        • Etcd
      • 基础
      • 数据库
        • 工具
        • 区块链
        • 非关系型
        • 关系型
        • 列型
        • 图型
        • 数据仓库
    • 前端
    • 移动端
      • Android
      • IOS
    • 区块链
      • 原理
      • Page 4
      • 公链架构
        • Ethereum
          • 基础
            • 交易
            • Page 15
            • Page 14
            • Page 13
            • Page 12
          • ETH2.0
            • 升级路线
            • 名词解释
            • Page 11
            • Page 10
          • 节点
          • 链桥
          • Page 8
          • Page 7
          • Page 6
        • Page 5
      • 存储架构
      • L2架构
      • Defi
      • 工具
      • Page 2
      • Page 1
      • Page
      • Page 3
    • 文件系统
      • 基础
      • NTFS
    • 系统架构
      • cex-架构
      • 仓储系统
    • 中间件
      • Web3
        • Moralis
      • 搜索
        • Algolia
      • AI
      • Consul
      • FFmpeg
      • MeiliSearch
      • 运维
        • K8s
          • 基础
          • 命令
    • 协议
      • RTMP
    • 密码学
    • 数据结构
    • 算法
    • 编译器
      • LLVM
    • 服务器
      • JBoss
      • Jetty
      • Nginx
      • Tomcat
      • Underow
    • 名词解释
    • 硬件
    • 信息论
    • 网络
    • 容器
    • AI
    • 内存
    • 安全
    • 分布式
    • 工具
      • Git
  • 基础科学
    • 电子信息
      • 模拟电路
      • 数字电路
      • 信号
    • 物理
    • 化学
    • 机械
      • 汽车
      • 发动机
      • 发射装置
      • 飞行器
      • 火箭
    • 金融
      • 基础
        • 劣后与优先
        • VIE架构
      • 技术指标
        • 斐波那契回撤
        • 蜡烛图(OHLC)
        • 贝塔系数
        • 斐波那契速度阻力扇
        • 斐波那契趋势时间
        • 斐波那契速度阻力弧
        • 斐波那契楔形
        • 斐波那契圈
        • 斐波那契时区
      • 债务理论
    • 数学
      • 基础
        • 概念
        • 规范
        • 数
        • 运算
          • 四则运算
          • 解析式
          • 幂运算
          • 因数分解
      • 代数
      • 方程
        • 二元一次方程
        • 一元二次方程
        • 分式方程
        • 不等式
        • 一次函数
        • 二次函数
        • 三元一次方程
        • 三角函数
        • 一元一次方程
        • 反比例函数
      • 概率与统计
      • 高等数学
      • 工具
    • 易经
      • 爻卦
  • 法律
    • 公司法
    • 管制刀具认定标准
    • 物权法
    • 刑法
    • 知识产权法
  • 人类语言
Powered by GitBook
On this page
  • 构造
  • 合并
  • 元组生成
  • 案例
  • 遍历
  • while-next 模式
  • for-in 模式
  • for_each 模式
  • 案例
  • 下一个元素
  • 提取前几个元素
  • 指定开始位
  • 获取最后一个元素
  • 反转
  • 跳过
  • 间隔步长
  • 顺序合并
  • 映射
  • 格式
  • 案例
  • 求值
  • 案例
  • 过滤
  • 格式
  • 案例
  • 过滤与映射
  • 案例
  • 收集
  • 全量校验
  • 格式
  • 案例
  • 累加器
  • 格式
  • 案例
  1. 计算机
  2. 语言
  3. Rust
  4. 基础
  5. 语法

迭代器

构造

use std::slice::Iter;
use std::iter::Iterator;
// 数组构造
let it = [1,2,3,4].iter();
// 向量构造
let it = vec![5; 3].iter();
// 可修改构造
let it = vec![5; 3].iter_mut();

合并

// chain()将两个迭代器顺序拼接合并,后续有例子,可拼接成无限多个
let it = (0..10).chain(20..30);
// 0~9~20~29

元组生成

zip() 将2个迭代器合并为一对一元组迭代器

let it = [1,3,5].iter().zip([2,4,6].iter());
assert_eq!(vec![(&1,&2),(&3,&4),(&5,&6)], it.collect::<Vec<(,)>>());
assert_eq!(vec![(0,'f'),(1,'o'),(2,'o')], (0..).zip("foo".chars()).collect::<Vec<_>>());
// 计算2个等长字符串中相同位置上字符不同的个数
let s1 = "amily";
let s2 = "emily";
let diff = s1.chars().zip(s2.chars()).filter(|x|x.0 != x.1).count();
println!("{diff}");//1

案例

let a = [1,2,3].iter();
let b = ['a', 'b', 'c', 'd'].iter();
let x = a.zip(b);
//(1, 'a')(2, 'b')(3, 'c'),会忽略 'd'
for c in x {
    print!("{:?}", c);
}
// 如果三个合并
let a = [1, 2, 3].iter();
let b = ['a', 'b', 'c', 'd'].iter();
let c = [1, 2, 3].iter();
let x = a.zip(b).zip(c);
//(1, ('a', 1))(2, ('b', 2))(3, ('c', 3))
for c in x {
    print!("{:?}", c);
}

遍历

while-next 模式

let mut iter = [1,2,3,4,5].iter();
// 输出:1 2 3 4 5 
// Some(x) 不为空就一直循环
while let Some(x) = iter.next() {
    print!("{:?} ", x);
}

for-in 模式

let it = 0..10;//[0,9]
// for-in循环对迭代器进行遍历
for i in it {
    print!("{} ", i);
}
// 无限循环
for i in 0..{
}

for_each 模式

// for_each()对元素逐个处理,内部调用的是fold(),
// fold()在后面有解释其用法
(1..=3).for_each(|x| {
    print!("{x} ");//1 2 3 
});

案例

遍历切片

let full_slice: &[i32] = &nums1[..];
println!("{:?}", full_slice);// 完整切片
// 对切片类型,还可以进行切片
println!("{:?}", &full_slice[1..3]);// [2,3]
println!("{:?}", &&nums1[0..4][1..3]);// [2,3]
println!("{:?}", &nums1[0..2]);// [1,2]
println!("{:?}", &nums1[2..]);// [3,4,5,6]
println!("{:?}", &nums1[1..nums1.len()-1]);// [2,3,4,5]

let x = [1, 2, 3, 4, 5, 6];
let y = &x[0..3];
println!("{:?}", y);//[1, 2, 3]
let y = &x[0..=3];
println!("{:?}", y);//[1, 2, 3, 4]

//b开头的字符串,在编译器看来就是u8数组的引用
let x: &[u8; 11] = b"Hello World";
for c in x {
    // c是&u8类型,即u8的引用类型
    // 这里将c解引用后的u8类型转为char类型
    print!("{} ", *c as char);
}
println!();
// u8数组的切片
let x_slice1 = &x[0..2];
println!("{:?}", x_slice1);//[72, 101]

遍历数组

// 1.
for i in 0..nums1.len() {
    println!("{} ", nums1[i]);
}
// 2.
for (pos, v) in nums1.iter().enumerate() {
    println!("nums[{}]={}", pos, v);
}
// 3.
for num in nums1 {
    print!("{} ", num);
}

下一个元素

next() 可多次调用,一次取出一个值,直至返回None。调用一次,迭代里中就会少一个元素。

// next()方法取得迭代器中下一个元素
let mut it = 1..3;
assert_eq!(Some(1), it.next());
assert_eq!(Some(2), it.next());
assert_eq!(None, it.next());

提取前几个元素

take(k)取前面k个元素,只可调用一次 迭代器调用take()后,迭代器的所有权会被转移到take方法内部,因此一个迭代器的take方法只能调用一次。

使用后该迭代器不能再使用,所有权已经转移到 take 函数内部。

assert_eq!(vec![1,2,3], (1..10).take(3).collect::<Vec<_>>());

指定开始位

nth(k)

取得迭代器剩余元素中第k个位置的元素,位置从0开始;之后,迭代器跳转到下一个位置。

let mut it = [1, 2, 3].iter();
assert_eq!(Some(&1), it.nth(0));
assert_eq!(Some(&2), it.nth(0));
assert_eq!(Some(&3), it.nth(0));
assert_eq!(None, it.nth(0));
assert_eq!(Some(3), (0..4).nth(3));

获取最后一个元素

last()

只取最后一个元素,只能调用一次。所有权已经转移。

assert_eq!((1..4).last(), Some(3));

反转

//反向遍历
println!("{:?}", "-".repeat(10));
//输出:4,3,2,1,0,
vec![0, 1, 2, 3, 4].iter().rev().for_each(|x|print!("{x},"));
println!();
//输出:9,8,7,6,5,4,3,2,1,0,
for i in (0..10).rev() {
    print!("{:?},", i);
}
println!("\n{:?}", "-".repeat(10));

跳过

skip(k)跳过k个元素

assert_eq!(vec![2,3], (0..4).skip(2).collect::<Vec<_>>());

间隔步长

step_by(k),从第一个元素开始,每k个取一个出来

//0 2 4 6 8 10 
(0..=10).step_by(2).for_each(|x| print!("{x} "));
assert_eq!(vec![0,2,4,6], (0..7).step_by(2).collect::<Vec<_>>());

顺序合并

chain() 方法对迭代器进行顺序拼接合并

let it = (0..5).chain(15..20);
//[0, 1, 2, 3, 4, 15, 16, 17, 18, 19]
println!("{:?}", it.collect::<Vec<_>>());

映射

map()方法,对迭代器中每一个元素进行映射

格式

map(|item|{})

案例

assert_eq!(vec![0,1,4,9,16], (0..5).map(|x|x*x).collect::<Vec<_>>());

求值

max()
min()
count()
sum()

案例

//最大值
assert_eq!([1,2,3].iter().max(), Some(&3));
//最小值
assert_eq!([1,2,3].iter().min(), Some(&1));
// count()计算迭代器中元素的个数
assert_eq!([1,2,3].iter().count(), 3);
// 求和
assert_eq!([1,2,3].iter().sum::<i32>(), 6);

过滤

过滤数据。接受一个闭包并为迭代器中的每个元素调用该闭包。如果闭包返回true,则元素将包含在新的迭代器中。 对迭代器中的元素进行“过滤”,只留下满足条件的元素;

格式

iter.filter(|x| 与x相关的条件,这里返回一个bool值)
// x : 项

案例

let list2: Vec<_> = (1..=100).filter(|i| i%3 == 0).collect();
assert_eq!(list1, list2);

过滤与映射

filter_map(|item|{})

案例

filter + map的组合。

let s = "1 a 2 b 3 c";
let a = s.split_ascii_whitespace().filter_map(|x|x.parse::<i32>().ok()).collect::<Vec<i32>>();
//[1, 2, 3]
println!("{:?}", a);

收集

方法负责将迭代器中的元素按顺序收集到一个集合容器中。

collect()

全量校验

判断迭代器中是否所有元素都符合闭包predicate指定的测试。

格式

all(|item| item==&x)

案例

let b = (2..10).into_iter().all(|i|i>0);
println!("{}", b);//true

累加器

fold()方法,通过传入一个初始值和一个闭包累加器,对迭代器中的每一个元素依次进行处理并“累加”,最后返回“累加”结果。这里用“累加”来指代函数操作,并不仅仅是能做加法。

格式

fold(初始值,|acc,item|{ return acc });
// acc : 累积值
// x : 迭代项
// 返回值 : acc
// 闭包内返回值 : 直接返回给acc

案例

// 案例一
assert_eq!(3, (1..3).fold(0, |acc, x|acc+x));//1+2
assert_eq!(6, (1..3).fold(0, |acc, x|acc+2*x));//2*1 + 2*2
// 案例二
println!("{:?}", a.fold(0, |mut acc, item| {
    acc + item
}));
Previous静态变量Next运算符

Last updated 1 year ago