gpt4 book ai didi

arrays - 如何将可变数组划分为可变子数组

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

我需要将可变数组分成 3 个具有可变元素的可变子数组。

#[derive(Debug)]
struct Server {
time: i64
}


impl Server {
fn new(x: i64) -> Server {
return Server {
time: x
}
}
}

fn main() {
let mut arr = Vec::<Server>::new();
arr.push(Server::new(10));
arr.push(Server::new(20));
arr.push(Server::new(30));
arr.push(Server::new(40));
arr.push(Server::new(50));

let mut arr1 = arr.iter_mut().filter(|x| x.time > 20).collect::<Vec<&mut Server>>();
let mut arr2 = arr.iter_mut().filter(|x| x.time < 20).collect::<Vec<&mut Server>>();
let mut arr3 = arr.iter_mut().filter(|x| x.time == 20).collect::<Vec<&mut Server>>();
}

接下来,对每个子数组执行不影响主数组的不同操作。 (例如,首先在不影响主数组顺序的情况下对每个子数组进行排序。下一步是在每个子数组上操作其元素。这些更改应反射(reflect)在主数组的元素中)。

目前Rust在编译时对数组进行分割,报如下错误:

error[E0499]: cannot borrow `arr` as mutable more than once at a time
--> src/main.rs:26:18
|
25 | let mut arr1 = arr.iter_mut().filter(|x| x.time > 20).collect::<Vec<&mut Server>>();
| --- first mutable borrow occurs here
26 | let mut arr2 = arr.iter_mut().filter(|x| x.time < 20).collect::<Vec<&mut Server>>();
| ^^^ second mutable borrow occurs here
...
29 | }
| - first borrow ends here
error[E0499]: cannot borrow `arr` as mutable more than once at a time
--> src/main.rs:27:18
|
25 | let mut arr1 = arr.iter_mut().filter(|x| x.time > 20).collect::<Vec<&mut Server>>();
| --- first mutable borrow occurs here
26 | let mut arr2 = arr.iter_mut().filter(|x| x.time < 20).collect::<Vec<&mut Server>>();
27 | let mut arr3 = arr.iter_mut().filter(|x| x.time == 20).collect::<Vec<&mut Server>>();
| ^^^ second mutable borrow occurs here
28 |
29 | }
| - first borrow ends here

最佳答案

您可以使用 Iterator::partition将您的 vec 分成两个不同的 vec 而无需克隆内部元素。因为你想要三个不同的拆分,所以你必须使用 partition 两次(顺序无关紧要)。

const THRESHOLD: i64 = 20;

let mut arr = Vec::<Server>::new();
arr.push(Server::new(10));
arr.push(Server::new(20));
arr.push(Server::new(30));
arr.push(Server::new(40));
arr.push(Server::new(50));

let (greater, rest): (Vec<_>, Vec<_>) = arr.into_iter().partition(|s| s.time > THRESHOLD);
let (equal, less): (Vec<_>, Vec<_>) = rest.into_iter().partition(|s| s.time == THRESHOLD);

( playground )

因为 Vectors greaterequalless 拥有相应的元素,所以您可以对它们进行可变访问。

关于arrays - 如何将可变数组划分为可变子数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53764656/

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