gpt4 book ai didi

rust - 将结构插入映射而不复制它时,如何使用结构的成员作为其自己的键?

转载 作者:行者123 更新时间:2023-11-29 07:49:29 26 4
gpt4 key购买 nike

是否可以将结构插入到映射中,其中键由所插入的值拥有?

在 C 中使用 HashMap 时,这是我习惯做的事情。

伪代码示例:

struct MyStruct {
pub map: BTreeMap<&String, StructThatContainsString>,
// XXX ^ Rust wants lifetime specified here!
}

struct StructThatContainsString {
id: String,
other_data: u32,
}

fn my_fn() {
let ms = MyStruct { map: BTreeMap::new() };

let item = StructThatContainsString {
id: "Some Key".to_string(),
other_data: 0,
}

ms.insert(&item.id, item);
}

如何正确处理这种情况?


  • 如果这不可能,是否可以进行相反的操作,其中值包含对键的引用,该键将是 String

  • 另一种方法是使用 set 而不是 map,然后将整个 struct 存储为键,但是比较 时只使用它的一个值(看起来它可以工作,但如果你想在其他上下文中比较 struct 可能会适得其反)

    <

最佳答案

它不适用于普通引用:

let item = StructThatContainsString {
id: "Some Key".to_string(),
other_data: 0,
}

ms.insert(&item.id, item);

item到 map 中,因此不会有任何待处理的借用/引用。

此外,像 get_mut() 这样的方法会变得危险或不可能,因为它会让您修改具有突出引用的项目。

假设想要这样做的原因是为了节省空间,显而易见的选择是:

  • 从值结构中取出键。如果您同时需要它,您可以在映射中查找键时获得它,或者迭代器包括键和值:

    struct OnlyKey {
    id: String,
    }

    struct OnlyValue {
    other_data: u32,
    }

    这可以通过适当的方法拆分/重组各个部分来清理。

  • 使用像 Rc 这样的东西对于值的关键部分。 Rc<T>工具 Ord (对于 BTreeMap 是必需的)如果 T

    struct StructThatContainsString {
    id: Rc<String>,
    other_data: u32,
    }

关于rust - 将结构插入映射而不复制它时,如何使用结构的成员作为其自己的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41035869/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com