当前位置: 首页 > 知识库问答 >
问题:

使用带向量的映射

邓高韵
2023-03-14

虽然向量最适合程序性编程,但我想对它们使用< code>map函数。以下代码片段有效:

fn map<A, B>(u: &Vec<A>, f: &Fn(&A) -> B) -> Vec<B> {
    let mut res: Vec<B> = Vec::with_capacity(u.len());
    for x in u.iter() {
        res.push(f(x));
    }
    res
}

fn f(x: &i32) -> i32 {
    *x + 1
}

fn main() {
    let u = vec![1, 2, 3];
    let v = map(&u, &f);
    println!("{} {} {}", v[0], v[1], v[2]);
}

为什么标准库中没有这样的函数?(以及 std::collections::LinkedList)。有没有其他方法可以处理它?

共有2个答案

公良高刚
2023-03-14

正如bluss所指出的,您还可以使用可变迭代器就地改变值,而不改变类型:

let mut nums = nums;
for num in &mut nums { *num += 1 }
println!("{:p} - {:?}", &nums, nums);

函数< code>Vec::map_in_place在Rust 1.3中被弃用,在Rust 1.4中不再存在。

Chris Morgan的答案在99%的情况下是最佳解决方案。但是,有一个名为Vec::map_in_place的专门函数。这有一个好处,即不需要任何额外的内存分配,但它要求输入和输出类型大小相同(感谢Levans),并且当前不稳定:

fn map_in_place<U, F>(self, f: F) -> Vec<U> 
    where F: FnMut(T) -> U

一个例子:

#![feature(collections)]

fn main() {
    let nums = vec![1,2,3];
    println!("{:p} - {:?}", &nums, nums);

    let nums = nums.map_in_place(|v| v + 1);
    println!("{:p} - {:?}", &nums, nums);
}
唐阳飙
2023-03-14

Rust 喜欢比这更通用。映射是通过迭代器完成的,而不仅仅是在向量或切片上完成的。

几个演示:

let u = vec![1, 2, 3];
let v: Vec<_> = u.iter().map(f).collect();
let u = vec![1, 2, 3];
let v = u.iter().map(|&x| x + 1).collect::<Vec<_>>();

<代码>。collect()可能是其中最神奇的部分,它允许您将迭代器的所有元素收集到各种不同的类型中,如< code>FromIterator的实现者所示。例如,可以将< code>T的迭代器收集到< code>Vec中

这种使用迭代器的方式也意味着你通常甚至不需要创建中间向量,而在其他语言或其他技术中,你会这样做。这更有效,通常同样自然。

 类似资料:
  • 我有一个映射定义为 其中定义如下: 反向映射是使用处理的。如何为反向映射指定自定义映射?

  • 我试图将元组向量转换为向量[人],但上面的代码会导致强制转换异常,即使存在隐式的元组-人转换函数? 线程“main”java中出现异常。lang.ClassCastException:scala。Tuple2无法转换为示例。例如,测试$人。测试$$anonfun$2$$anonfun$应用$1。在scala应用(测试scala:19)。收集迭代器$类。scala上的foreach(迭代器。scal

  • 我试图正确地建立不同实体之间的关系。 看着代码,我认为一切都是好的和连贯的(我已经验证了属性的名称与在Hibernate映射配置文件中建立的名称相同),但是,好吧,它没有编译。所以很明显这是不可以的。显示的错误如下: antlr-2.7.6.jar aopalliance-1.0.jar aspectjrt-1.6.8.jar AspectJTools-1.5.4.jar AspectJWeave

  • 问题内容: 映射双向列表时,我不了解Hibernate的行为。Hibernate生成的SQL语句对我来说并不是最佳的。有人可以启发我吗? 情况如下:我有一对多的父子关系。我将此关系与双向列表映射。 根据《Hibernate注释参考指南》(第7章:与索引集合的双向关联),映射应如下所示: 但是在这种情况下,Hibernate在保留一个孩子的父母时会产生三个SQL语句: 第三条语句似乎是多余的,因为并

  • 我正在做一个简单的天气应用程序,我有一个问题,通过AsyncTask读取变量。我是andorid编程的初学者,所以我要求理解。因此,我想将变量“latitude”和“longitude”从place picker中选择到asynctask.execute(“latitude”,“longitude”)中,并刷新屏幕以显示新位置的天气。但我注意到,当我在代码中不是通过变量(例如asynctask.e

  • 我想知道v1.swap(v2)使用std::交换(v1, v2)有什么好处。 从性能角度来看,我已经实现了一个简单的测试代码(我不确定它是否相关): 根据输出,向量::swap似乎在没有优化的情况下更快-O0。输出为(微秒): 与-O3没有显著差异。