- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个集合,它是某个模块中结构中的一个字段。我想从另一个模块更新集合中的所有值。
我写了一些代码来模仿我想要实现的目标。它缩短了一点,但我认为它具有所有需要的部分。这段代码中没有保存集合的结构,但可以想象这是一个返回集合的 getter。我在评论中添加了我认为它应该是什么样子。
pub mod pos {
use std::cmp::{Ordering, PartialEq};
#[derive(PartialOrd, PartialEq, Eq, Hash, Debug, Copy, Clone)]
pub struct Pos {
pub x: i32,
pub y: i32,
}
#[allow(dead_code)]
impl Pos {
pub fn of(x: i32, y: i32) -> Self {
Self { x, y }
}
pub fn offset(&mut self, pos: &Self) -> Self {
self.x += pos.x;
self.y += pos.y;
*self
}
}
impl Ord for Pos {
fn cmp(&self, other: &Self) -> Ordering {
if self.x < other.x {
Ordering::Less
} else if self.eq(other) {
Ordering::Equal
} else {
Ordering::Greater
}
}
}
}
mod test {
use crate::pos::Pos;
use std::collections::BTreeSet;
#[test]
fn test_iterators() {
let mut data_in_some_strct: BTreeSet<Pos> = BTreeSet::new();
data_in_some_strct.insert(Pos::of(1, 1));
data_in_some_strct.insert(Pos::of(2, 2));
data_in_some_strct.insert(Pos::of(3, 3));
data_in_some_strct.insert(Pos::of(4, 4));
// mimic getter call ( get_data(&mut self) -> &BTreeSet<Pos> {...}
// let set = data_in_some_strct; // works, but not a reference
let set = &data_in_some_strct; // doesn't work, How to adjust code to make it work??
data_in_some_strct = set
.into_iter()
.map(|mut p| p.offset(&Pos::of(1, 0)))
.inspect(|p| println!("{:?}", *p))
.collect();
assert_eq!(data_in_some_strct.contains(&Pos::of(2, 1)), true);
assert_eq!(data_in_some_strct.contains(&Pos::of(3, 2)), true);
assert_eq!(data_in_some_strct.contains(&Pos::of(4, 3)), true);
assert_eq!(data_in_some_strct.contains(&Pos::of(5, 4)), true);
}
}
error[E0596]: cannot borrow `*p` as mutable, as it is behind a `&` reference
--> src/lib.rs:56:26
|
56 | .map(|mut p| p.offset(&Pos::of(1, 0)))
| - ^ `p` is a `&` reference, so the data it refers to cannot be borrowed as mutable
| |
| help: consider changing this to be a mutable reference: `&mut pos::Pos`
我设法让它在不借用的情况下工作,但我想让它在借用的情况下工作。我想有不止一种方法可以实现它。评论帮助我的 Rust brain dendrites欢迎联系。
最佳答案
您不能改变属于 HashSet
或 BTreeSet
的项目,因为项目的值 决定了它们的存储方式和访问过。如果你改变它们,那么 Stargateur mentioned ,你会破坏集合的机制。在 HashSet
的情况下,您可以更改项目的哈希值,它决定了数据的存储位置。对于 BTreeSet
,算法基于项目的排序方式。
您可以通过取得所有权来做到这一点,因为您使用了原始集合并生成了一个新的、格式良好的集合。您不能取得借用值的所有权,因为那样会留下悬空指针,而 Rust 不允许您这么做。
一种可能的解决方案是暂时用一个空的集合替换原来的集合。然后,您可以像在您的工作代码中那样获得其内容的所有权,并最终在原始代码上编写新更新的集合:
let set = std::mem::replace(&mut data_in_some_strct, BTreeSet::new());
data_in_some_strct = set.into_iter()
.map(|mut p| p.offset(&Pos::of(1,0)))
.inspect(|p| println!("{:?}", *p))
.collect();
关于collections - 如何更新 BTreeSet 中的所有值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54697274/
有没有办法加入BTreeSet在使用空格的同时使用它来获取每个元素由空格分隔的字符串,而不是通过遍历每个元素并推送到一个字符串? 我的集合可能非常大,最多可能有 10GB,所以我想限制内存使用量。 t
我有一个集合,它是某个模块中结构中的一个字段。我想从另一个模块更新集合中的所有值。 我写了一些代码来模仿我想要实现的目标。它缩短了一点,但我认为它具有所有需要的部分。这段代码中没有保存集合的结构,但可
我想修改 BTreeSet 中的结构。 我想实现类似以下的东西 here : use std::collections::BTreeSet; #[derive(Eq, PartialEq, Ord,
在 Rust 中,我有一个 BTreeSet,我用它来保持我的值有序。我有一个循环,应该检索并删除集合的第一个(最低)成员。我正在使用克隆的迭代器来检索第一个成员。这是代码: use std::col
我有一个 BTreeSet并且需要小于给定元素的最大元素。看起来我会使用类似的东西: let set: BTreeSet = ...; let e: T = ...; let result = e.r
我希望能够在 Rust BTreeSet 中找到严格小于和大于指定键的键。 例如,给定集合 { "1", "3"},搜索关键字是 "2" 那么答案应该是 ( “1”,“3”)。在不存在更低或更高值的情
阅读 BTreeSet 文档,我似乎无法弄清楚如何从 BTreeSet 中获取大于元素的最小值或小于元素的最大值对数时间。 我看到有一个 range可以在任意(最小值、最大值)范围内给出值的方法,但是
在C++中,可以自定义代码std::set用于对其参数进行排序。默认情况下它使用 std::less , 但这可以用 Compare 改变模板参数。 Rust 的 BTreeSet使用 Ord对类型进
我不确定这是否是一个新手问题。 rust 标准库 std::collections提供 map 和 set 的 B-tree 实现。 我查看了文档 here ,但我找不到用于实现的分支因子 m。 最佳
如果我对 B 树的理解正确,那么在对数时间内搜索 key 应该是容易且可能的。如果key不存在,返回下一个更小更大的key;给定键的邻居,如果它会被插入。 这个功能是否已经存在? 使用当前 API 的
我想从 BTreeMap 中删除通过迭代找到的项目。 由于无法在迭代时删除项目,我将要删除的项目放入一个向量中。主要问题是不可能使用引用 向量,而只能使用值向量。然后必须克隆所有必须删除条目的 key
我有如下代码(更大库的一部分)。编译器告诉我元组没有实现特征,但我有一个元组和该元组的一个元素的实现。它适用于另一种类型的元组。 为什么元组 (BTreeSet)在这里没有匹配? use std::c
我想从 BTreeMap 中删除通过迭代找到的项目。 由于无法在迭代时删除项目,我将要删除的项目放入一个向量中。主要问题是不可能使用引用 向量,而只能使用值向量。然后必须克隆所有必须删除条目的 key
我在使用 BTreeSet::range 方法时遇到了一些问题。 use std::collections::BTreeSet; use std::ops::Bound::Included; fn m
我是不是遗漏了什么,或者没有办法让迭代器从 BTreeSet 中新插入的值开始? BTreeSet::insert只返回一个 bool 值。作为比较,C++ 中 std::map 的 insert 方
另一个基本的 Rust 问题:有人可以举一个使用 from_iter 的例子吗?创建BTreeSet ? 据推测,BTreeSet 确实实现了 FromIterator 特性,但最有用的形式是: le
我需要快速找出两个给定集合中存在的整数个数。这些集合只写入一次,但此操作将针对不同的集合对执行多次。这些集合包含 5-30 个整数,其中最大的整数是 840000。 我最初尝试迭代一个 Vec 并为每
我有一个Ref>,我想获取其内容的引用作为Vec>。 一种方法是: fn get_refs(btree: Ref>) -> Vec> { let mut result = Vec::new()
我一直在尝试实现 Bron-Kerbosch algorithm在 Rust 中为我的硕士论文。到目前为止一切正常,但是当我尝试从 BTreeSet 更改时到 HashSet出于性能比较的目的,行为变
我正在尝试从 Vec> 创建一个集合向量 ( Vec> ) .这是我目前的进展: use std::collections::BTreeSet; fn main() { // The data
我是一名优秀的程序员,十分优秀!