鸿蒙PC适配llvm-gcc-compat编译安装第三方库itertools,打造Rust 第三方迭代器增强库

📅 2026/6/24 5:35:01
鸿蒙PC适配llvm-gcc-compat编译安装第三方库itertools,打造Rust 第三方迭代器增强库
欢迎加入开源鸿蒙PC社区 https://harmonypc.csdn.net/欢迎在PC社区平台申请新建项目https://atomgit.com/OpenHarmonyPCDeveloperAtomGit 仓库地址https://atomgit.com/OpenHarmonyPCDeveloper/ohos_rust_cargo本文讲解鸿蒙 PC 端 Rust 开发环境搭建鸿蒙基于 musl 库、强制二进制签名无法直接使用通用 Linux 编译产物。需借助鸿蒙专属包管理器 Harmonybrew提供两套编译方案方案一安装 llvm-gcc-compat零配置开箱即用方案二仅安装 ohos-sdk需手动配置 Cargo 链接器二者都依托 ohos-sdk 完成自动签名编译。可以来参考一下这个文章搭建环境OpenHarmony 鸿蒙 PC CodeArts IDE 实现 Rust开发完整开发环境搭建指南一、Rust itertools 是什么itertools是 Rust 第三方迭代器增强库标准库Iterator功能比较单薄这个库补充大量实用迭代工具排列、组合、笛卡尔积、带重复组合算法常用分组、去重、窗口滑动、相邻配对、交叉合并批量变换、折叠、分块、平铺、链式处理惰性迭代性能高内存占用小二、第一步创建 Rust 项目并安装依赖你之前报错是因为在 Python 文件夹执行cargo必须先建 Rust 项目# 1. 退出python目录新建rust项目cd/storage/Users/currentUser/workspace/code/cargonew iter_democditer_demo# 2. 添加itertools依赖cargoadditertools此时项目内会生成Cargo.toml里面自动写入依赖[dependencies] itertools 0.13三、完整可运行 main.rs复制覆盖全部内容useitertools::Itertools;fnmain(){// 1. 笛卡尔积 cartesian_product letnums[1,2];letchars[a,b];letproduct:Vec_nums.iter().cartesian_product(chars.iter()).collect();println!(笛卡尔积: {:?},product);// 2. 全排列 permutations letarr[1,2,3];letperm:Vec_arr.iter().permutations(2).collect();println!(2元素全排列: {:?},perm);// 3. 组合 combinations letcomb:Vec_arr.iter().combinations(2).collect();println!(2元素组合: {:?},comb);// 4. 可重复组合 combinations_with_replacement letcomb_rep:Vec_[1,2].iter().combinations_with_replacement(2).collect();println!(可重复组合: {:?},comb_rep);println!(----------------------------------------);// 5. chain 拼接迭代器 letch:Vec_[1,2].iter().chain([3,4].iter()).collect();println!(chain拼接: {:?},ch);// 6. tuple_windows 滑动窗口 letslide:Vec_[10,20,30,40].iter().tuple_windows::(_,_)().collect();println!(相邻二元滑动窗口: {:?},slide);// 7. chunk_by 分组替代废弃 group_by letdatavec![1,1,2,2,2,3];letgroups:Vec_data.iter().chunk_by(|x|x).into_iter().map(|(k,g)|(k,g.collect::Vec_())).collect();println!(分组结果: {:?},groups);// 8. unique 去重 letdup[1,2,2,3,3,3];letuniq:Vec_dup.iter().unique().collect();println!(去重: {:?},uniq);// 9. interleave 交叉合并 leta[1,3,5];letb[2,4,6];letinter:Vec_a.iter().interleave(b.iter()).collect();println!(交叉合并: {:?},inter);// 10. reduce 累加替代废弃 fold1into_iter 取出数值而非引用 letsum[1,2,3,4].into_iter().reduce(|a,b|ab);println!(累加总和: {:?},sum.unwrap());}四、运行命令在iter_demo目录执行cargorun五、输出结果预览笛卡尔积: [(1, a), (1, b), (2, a), (2, b)] 2元素全排列: [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]] 2元素组合: [[1, 2], [1, 3], [2, 3]] 可重复组合: [[1, 1], [1, 2], [2, 2]] ---------------------------------------- chain拼接: [1, 2, 3, 4] 相邻二元滑动窗口: [(10, 20), (20, 30), (30, 40)] 分组结果: [(1, [1, 1]), (2, [2, 2, 2]), (3, [3])] 去重: [1, 2, 3] 交叉合并: [1, 2, 3, 4, 5, 6] 累加总和: 10这段代码是itertools库十大高频迭代器工具示例itertools是Rust标准迭代器的增强扩展库提供Python itertools同款组合、排列、分组、窗口、去重等能力。前置依赖说明使用前必须在Cargo.toml添加依赖[dependencies] itertools 0.13导入use itertools::Itertools;所有扩展方法都通过这个trait挂载到迭代器上。1. cartesian_product 笛卡尔积letnums[1,2];letchars[a,b];letproduct:Vec_nums.iter().cartesian_product(chars.iter()).collect();println!(笛卡尔积: {:?},product);作用两个迭代器所有元素两两配对数学笛卡尔积顺序(第一个迭代器元素, 第二个迭代器元素)输出笛卡尔积: [(1, a), (1, b), (2, a), (2, b)]关键点cartesian_product(另一迭代器)不消耗原数组.iter()产出引用适合多维度枚举、双循环简化2. permutations 全排列letarr[1,2,3];letperm:Vec_arr.iter().permutations(2).collect();println!(2元素全排列: {:?},perm);作用从序列中选k个元素有序、不重复选取元素顺序不同算两种结果排列输出2元素全排列: [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]区分重点排列关心顺序[1,2]和[2,1]是不同项参数2代表每组长度为2。如果不传参数.permutations()会生成全部元素的完整全排列。3. combinations 组合letcomb:Vec_arr.iter().combinations(2).collect();println!(2元素组合: {:?},comb);作用选k个元素无序、不重复选取只保留升序唯一一组输出2元素组合: [[1, 2], [1, 3], [2, 3]]和permutations对比组合只保留不重复集合没有反向项排列区分顺序。4. combinations_with_replacement 可重复组合letcomb_rep:Vec_[1,2].iter().combinations_with_replacement(2).collect();println!(可重复组合: {:?},comb_rep);作用允许同一个元素重复选取无序组合输出可重复组合: [[1, 1], [1, 2], [2, 2]]使用场景骰子、可重复抽奖、多选可重复场景5. chain 迭代器拼接letch:Vec_[1,2].iter().chain([3,4].iter()).collect();println!(chain拼接: {:?},ch);作用把多个迭代器首尾拼接成一个标准库也有chain但itertools支持多链链式调用输出chain拼接: [1, 2, 3, 4]拓展iter1.chain(iter2).chain(iter3)拼接任意数量序列6. tuple_windows 固定长度滑动窗口letslide:Vec_[10,20,30,40].iter().tuple_windows::(_,_)().collect();println!(相邻二元滑动窗口: {:?},slide);作用滑动窗口一次性返回元组无需手动zip泛型指定窗口长度(_, _) 窗口大小2(_,_,_) 窗口大小3输出相邻二元滑动窗口: [(10, 20), (20, 30), (30, 40)]对比标准库标准库只有.windows()返回切片tuple_windows直接返回元组解构更方便。7. chunk_by 按条件分组letdatavec![1,1,2,2,2,3];letgroups:Vec_data.iter().chunk_by(|x|x).into_iter().map(|(k,g)|(k,g.collect::Vec_())).collect();println!(分组结果: {:?},groups);作用相邻且key相同的元素分为一组key由闭包生成执行流程chunk_by(|x| x)用元素自身作为分组key返回Chunk迭代器每个item是(key, 同组元素迭代器)map把每组迭代器收集成Vec方便打印输出分组结果: [(1, [1, 1]), (2, [2, 2, 2]), (3, [3])]注意只对连续相同key分组不全局分组如果需要全局分组要配合sorted先排序。8. unique 迭代器去重letdup[1,2,2,3,3,3];letuniq:Vec_dup.iter().unique().collect();println!(去重: {:?},uniq);作用遍历迭代器自动过滤重复元素保留第一次出现的值输出去重: [1, 2, 3]拓展变体unique_by(|x| 关键字)按自定义字段去重9. interleave 交叉合并两个迭代器leta[1,3,5];letb[2,4,6];letinter:Vec_a.iter().interleave(b.iter()).collect();println!(交叉合并: {:?},inter);作用交替取a一个、b一个穿插合并输出交叉合并: [1, 2, 3, 4, 5, 6]长短序列规则如果两个迭代器长度不同短的耗尽后直接追加长迭代器剩余元素。10. reduce 迭代器归约求和标准库原生itertools兼容letsum[1,2,3,4].into_iter().reduce(|a,b|ab);println!(累加总和: {:?},sum.unwrap());作用迭代器累计聚合第一个值作为初始累加器依次和下一个元素运算细节区分.into_iter()获取数组所有权得到数字i32不是引用才能直接相加reduce返回OptionT空迭代器返回None所以用.unwrap()替代旧版itertools废弃的fold1现在标准库自带reduce输出累加总和: 10同类方法fold(初始值, 闭包)可自定义初始值sum()数字专用求和简化写法完整运行输出汇总笛卡尔积: [(1, a), (1, b), (2, a), (2, b)] 2元素全排列: [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]] 2元素组合: [[1, 2], [1, 3], [2, 3]] 可重复组合: [[1, 1], [1, 2], [2, 2]] ---------------------------------------- chain拼接: [1, 2, 3, 4] 相邻二元滑动窗口: [(10, 20), (20, 30), (30, 40)] 分组结果: [(1, [1, 1]), (2, [2, 2, 2]), (3, [3])] 去重: [1, 2, 3] 交叉合并: [1, 2, 3, 4, 5, 6] 累加总和: 10核心使用场景总结组合/排列算法枚举、密码生成、选项遍历窗口/分组时序数据、日志分段、相邻差值计算合并交叉多路数据流合并去重笛卡尔积多条件筛选、多维匹配关键注意点必须在 Rust 项目根目录存在Cargo.toml执行cargo命令不能在 Python 文件夹运行代码头部use itertools::prelude::*;一次性导入所有拓展迭代器方法Rust 迭代器惰性求值.collect()才会把结果转成集合打印group_by使用前数据最好排序否则相同元素不连续会分成多组。