如何使用Iterator实现两个Vec的笛卡尔乘积
Rust 两个Vec生成笛卡尔积拼接字符串的实现方案
纯标准库实现(无外部依赖)
直接使用标准库迭代器的flat_map和map组合即可实现需求,代码如下:
let x = vec!['1', '2', '3']; let y = vec!['a', 'b', 'c']; let result: Vec<String> = x .iter() .flat_map(|&x_char| { // 对x的每一个字符,遍历y的所有字符拼接,生成对应子迭代器 y.iter().map(move |&y_char| { format!("{x_char}{y_char}") }) }) .collect(); // 校验输出符合预期 assert_eq!( result, vec!["1a", "1b", "1c", "2a", "2b", "2c", "3a", "3b", "3c"] );
逻辑说明
- 外层调用
flat_map遍历x的所有字符,作用是将内层每个x字符对应的子迭代器的输出,摊平为一维的迭代器序列 - 内层调用
map遍历y的所有字符,通过move关键字将当前x字符转移进闭包,和y字符拼接为新的字符串 - 最后调用
collect方法,直接将迭代器转换为目标Vec<String>类型,无需手动循环添加元素
第三方库简化实现(可选)
如果项目允许引入第三方依赖,可以使用itertools库提供的cartesian_product方法,代码更简洁易读:
- 先在
Cargo.toml中添加依赖:
itertools = "0.12"
- 实现代码:
use itertools::Itertools; let x = vec!['1', '2', '3']; let y = vec!['a', 'b', 'c']; let result: Vec<String> = x .iter() .cartesian_product(y.iter()) .map(|(&x_char, &y_char)| format!("{x_char}{y_char}")) .collect();
内容的提问来源于stack exchange,提问作者abc
相关产品推荐
相关产品推荐

