如何在Rust中单次迭代合并元组序列中的嵌套序列?
Rust中单次迭代拼接元组序列的对应元素
你可以使用迭代器的fold方法,在单次遍历中完成两个Vec的拼接,同时避免多次迭代的开销。
方案1:转移原数据所有权(高效)
如果不需要保留原data的所有权,可以直接用into_iter转移元素所有权,避免克隆操作:
fn main() { let data = [ (vec![1, 2, 3], vec!['a']), (vec![4, 5, 6], vec!['b', 'c']) ]; let res: (Vec<i32>, Vec<char>) = data.into_iter().fold( (Vec::new(), Vec::new()), |(mut nums, mut chars), (num_vec, char_vec)| { nums.extend(num_vec); chars.extend(char_vec); (nums, chars) } ); assert_eq!(res.0, vec![1, 2, 3, 4, 5, 6]); assert_eq!(res.1, vec!['a', 'b', 'c']); }
方案2:保留原数据所有权
如果需要继续使用原data,可以用iter遍历引用,再通过cloned复制元素:
fn main() { let data = [ (vec![1, 2, 3], vec!['a']), (vec![4, 5, 6], vec!['b', 'c']) ]; let res: (Vec<i32>, Vec<char>) = data.iter().fold( (Vec::new(), Vec::new()), |(mut nums, mut chars), (num_vec, char_vec)| { nums.extend(num_vec.iter().cloned()); chars.extend(char_vec.iter().cloned()); (nums, chars) } ); // 原data仍可正常访问 assert_eq!(data[0].0, vec![1, 2, 3]); assert_eq!(res.0, vec![1, 2, 3, 4, 5, 6]); assert_eq!(res.1, vec!['a', 'b', 'c']); }
核心思路
fold方法允许你在单次迭代中维护多个累积状态(这里是两个空Vec),每次遍历元组时,将对应位置的序列扩展到累积Vec中,最终返回拼接完成的元组,完全符合需求。
内容的提问来源于stack exchange,提问作者qoqosz
相关产品推荐
相关产品推荐

