Rust中如何将元组构成的vector拆分为两个独立列表?
实现方案
Rust 标准库的迭代器直接提供了unzip()方法,专门用于拆分元素为二元组的迭代器,是该场景下的最优解。
方法1:直接使用unzip(消耗原vector所有权)
let v = vec![(1, 1), (1, 1), (1, 3), (1, 4), (2, 2), (2, 4), (2, 6)]; let (l1, l2): (Vec<i32>, Vec<i32>) = v.into_iter().unzip();
执行后l1和l2就是你需要的两个独立列表。
方法2:保留原vector所有权
如果你后续还需要使用原vector,可以先通过迭代器拷贝元素再拆分:
let v = vec![(1, 1), (1, 1), (1, 3), (1, 4), (2, 2), (2, 4), (2, 6)]; // 元素实现Copy trait时可以用cloned() let (l1, l2): (Vec<i32>, Vec<i32>) = v.iter().cloned().unzip(); // 通用写法,不依赖Copy trait // let (l1, l2): (Vec<i32>, Vec<i32>) = v.iter().map(|(a, b)| (*a, *b)).unzip();
方法3:手动遍历(适合自定义逻辑场景)
如果你需要在拆分过程中添加额外处理逻辑,可以手动遍历:
let v = vec![(1, 1), (1, 1), (1, 3), (1, 4), (2, 2), (2, 4), (2, 6)]; // 提前分配容量,避免动态扩容提升性能 let mut l1 = Vec::with_capacity(v.len()); let mut l2 = Vec::with_capacity(v.len()); for (a, b) in v { l1.push(a); l2.push(b); }
内容的提问来源于stack exchange,提问作者Ziva
相关产品推荐
相关产品推荐

