You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:30:18