gpt4 book ai didi

rust - 更新 BTreeSet 中的结构

转载 作者:行者123 更新时间:2023-11-29 08:22:05 28 4
gpt4 key购买 nike

我想修改 BTreeSet 中的结构。

我想实现类似以下的东西 here :

use std::collections::BTreeSet;

#[derive(Eq, PartialEq, Ord, PartialOrd, Debug)]
struct X {
key: String,
val: Option<i32>,
}

fn main() {
let mut set: BTreeSet<X> = BTreeSet::new();
set.insert(X {
key: "a".to_string(),
val: Some(1),
});
set.insert(X {
key: "b".to_string(),
val: Some(1),
});

nonify(&mut set, "a".to_string());
println!("{:?}", set);
}

fn nonify(set: &mut BTreeSet<X>, k: String) {
for mut s in set.iter() {
if s.key == k {
s.val = None;
}
}
}

这不起作用,因为 s 不是可变引用。

我如何完成这样的事情?

最佳答案

修改 BTreeSet 中的对象使得它们的顺序发生变化是不安全的(就程序逻辑而言),因为这样做会破坏集合的内部结构 - 这是 relevant documentation 中的一个片段:

It is a logic error for an item to be modified in such a way that the item's ordering relative to any other item, as determined by the Ord trait, changes while it is in the set. This is normally only possible through Cell, RefCell, global state, I/O, or unsafe code.

我不知道您的确切用例,但由于您似乎使用的是键值对,因此 HashMapBTreeMap 可能在这里起作用:出于同样的原因,它们不允许您改变键,但是与键关联的值可能会发生变化。

关于rust - 更新 BTreeSet 中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58790368/

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