rust - 使用 1 个或多个元素使用和替换向量中的元素
问题描述
我试图找出一种有效的 Rust 方式来使用向量的元素并将它们替换为一个或多个(相同类型的)元素,就像在非编译示例中一样:
fn main() {
let mut myvec = vec![0, 1];
println!("{:?}", myvec);
for val in myvec.drain(..) {
myvec.push(val+2);
myvec.push(val+4);
}
println!("{:?}", myvec);
}
但是,我什至不确定 Rust 是否会允许这样做,因为每个操作都需要一个可变引用(即我们需要 2 个可变引用),但 Rust 只能允许一个。有没有办法做我想做的事,或者我只需要有 2 个单独的向量:
let mut myvec = vec![0, 1];
let mut newvec = Vec::new();
println!("{:?}", myvec);
for val in myvec.drain(..) {
newvec.push(val+2);
newvec.push(val+4);
}
println!("{:?}", newvec);
输出:
[0, 1]
[2, 4, 3, 5]
PS。我知道splice 方法可以实现我所需要的,但我还需要在 for 循环内有一个可变引用。
解决方案
由于您正在更改 的大小Vec
,因此很可能无论如何都需要重新分配。此外,您在迭代它的时候不能改变Vec
它(正是因为改变它可能会导致它重新分配)。收集到一个新的不会有太大的不同Vec
:
myvec = myvec
.drain(..)
.flat_map(|val| iter::once(val + 2).chain(iter::once(val + 4)))
.collect();
链式迭代器可能不是最佳的。在夜间 Rust中,您可以执行以下操作:
#![feature(array_value_iter)]
use std::array;
myvec = myvec
.drain(..)
.flat_map(|val| array::IntoIter::new([val + 2, val + 4]))
.collect();
哪个应该更有效。
推荐阅读
- jenkins - 如何在詹金斯电子邮件中显示测试总数和通过/失败计数
- java - Java - 从 Eclipse AST 视图解析 XML 文件
- java - 如何使用 GSON 解析没有根元素的 JSON 文件
- java - 有没有办法将数据从一个 servlet 传递到另一个,同时也将相同的数据传递给 jsp?
- android - 颤动从颤动视图导航到我的android中的新页面
- networking - 将 ipv6 ip 附加到 vagrant 中的公共网络
- javascript - 如何使以下jquery代码更高效
- javascript - 为什么JS在localhost而不是在线工作?
- two-factor-authentication - 如何将安全令牌用于 FIDO?
- javascript - 显示来自 json 的帖子