Rust中如何过滤Vector并返回匹配元素的索引而非值?
获取Vec中匹配过滤条件的元素索引的Rust实现
你可以借助迭代器的enumerate()方法实现需求:该方法会将迭代器的输出包装为(元素索引, 元素值)的元组,你只需要在完成条件过滤后,单独取出索引值收集即可。
参考代码:
let vec: Vec<u32> = vec![1, 3, 4, 7, 9, 10, 12]; let matched_indexes: Vec<usize> = vec .iter() .enumerate() .filter(|(_, val)| *val % 3 == 0) .map(|(idx, _)| idx) .collect(); println!("{:?}", matched_indexes); // 输出结果:[1, 4, 6]
实现细节说明:
- 此处使用
iter()而非原示例中的into_iter():into_iter()会拿走原Vec的所有权,将元素move出原集合,如果你后续还要使用原Vec,用iter()做不可变借用即可;如果不需要保留原Vec,替换为into_iter()也能正常运行。另外你给出的原有过滤示例存在变量名笔误:定义的Vec变量名为vec,调用迭代器时写的是v.into_iter(),直接运行会报错。 enumerate()返回的索引固定为usize类型,是Rust集合索引的标准类型。- 用
iter()迭代时,闭包里拿到的val是元素的引用,做数值判断前需要用*解引用。 - 如果你需要同时拿到匹配元素的索引和值,去掉末尾的
map步骤,直接将结果收集为Vec<(usize, &u32)>类型即可。
内容的提问来源于stack exchange,提问作者Luiz Martins
相关产品推荐
相关产品推荐

