如何优雅高效地对Rust结构体数组的成员变量求和?
高效优雅地对Rust结构体数组的成员变量求和
针对你的需求,有两种既高效又简洁的方案,完全避免不必要的内存分配或结构体实例创建:
方案一:使用fold直接累加
fold允许你指定一个初始值,并自定义累加逻辑,它不要求累加结果的类型与迭代器元素类型一致,正好解决reduce的类型匹配问题:
pub struct Var { val: i32, } fn main() { let var0 = Var { val: 0 }; let var1 = Var { val: 1 }; let array = [var0, var1]; // 初始值为0,每次迭代将当前Var的val加到累加器上 let sum: i32 = array.into_iter().fold(0, |acc, var| acc + var.val); println!("求和结果:{}", sum); // 输出1 }
这个方案全程只进行i32类型的加法运算,没有额外的结构体构造或内存分配,是效率最高的实现方式。
方案二:map配合sum()方法
利用迭代器的map转换每个元素为val,再直接调用sum()求和——这里的map是惰性迭代,不会像你之前那样创建中间Vec,而是在遍历过程中直接完成转换与累加:
pub struct Var { val: i32, } fn main() { let var0 = Var { val: 0 }; let var1 = Var { val: 1 }; let array = [var0, var1]; let sum: i32 = array.into_iter().map(|var| var.val).sum(); println!("求和结果:{}", sum); // 输出1 }
sum()内部本质也是基于fold实现的,同样没有额外内存开销,代码更简洁直观。
为什么之前的方法有问题?
- 用
reduce直接返回i32会报错:因为reduce要求闭包的返回类型必须和迭代器的元素类型(Var)一致,所以无法直接返回i32。 - 先
collect到Vec再求和:会额外分配内存存储所有val,对于大型数组来说会造成不必要的内存开销,完全没必要。
内容的提问来源于stack exchange,提问作者Rahn
相关产品推荐
相关产品推荐

