如何从BTreeMap中直接获取非引用类型的u32键?
针对BTreeMap获取Copy类型键的优化实现
你当前的实现是有效的,但确实有更简洁甚至更高效的方式,根据你是否需要保留原BTreeMap的所有权,可以选择以下两种方案:
方案1:不消耗原Map,简洁复制键
利用迭代器的copied()适配器,它专门为实现了Copy trait的类型设计,可以直接将&u32转换为u32,代码比你原来的map(|(k, _)| *k)更简洁:
use std::collections::BTreeMap; fn main() { let map = BTreeMap::from([ (0, "foo"), (1, "bar"), (2, "baz"), ]); let keys: Vec<u32> = map.keys().copied().collect(); }
copied()本质上和手动解引用逻辑一致,但它是更语义化的标准库方法,可读性更强。
方案2:消耗原Map,高效获取所有权
如果你之后不再需要使用原BTreeMap,可以使用into_keys()方法(Rust 1.63及以上版本支持),它会直接获取键的所有权,不需要复制操作,性能更优:
use std::collections::BTreeMap; fn main() { let map = BTreeMap::from([ (0, "foo"), (1, "bar"), (2, "baz"), ]); let keys: Vec<u32> = map.into_keys().collect(); // 此时map已被消耗,无法再使用 }
这种方式避免了复制开销,因为into_keys()会将BTreeMap中的键直接转移到新的Vec中,适合不需要保留原Map的场景。
内容的提问来源于stack exchange,提问作者Charles Edward Gagnon
相关产品推荐
相关产品推荐

