我写了一些Rust代码&String作为参数:
fn awesome_greeting(name: &String) {
println!("Wow, you are awesome, {}!", name);
}
Run Code Online (Sandbox Code Playgroud)
我还编写了代码来引用a Vec或Box:
fn total_price(prices: &Vec<i32>) -> i32 {
prices.iter().sum()
}
fn is_even(value: &Box<i32>) -> bool {
**value % 2 == 0
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到一些反馈意见,这样做并不是一个好主意.为什么不?
虽然Rust实现的所有整数类型Ord都强调总排序,但浮点类型只能实现PartialOrd.这意味着可能存在无法比较的浮点值.这似乎很难消化,因为浮点数可以被认为是实数的近似值,恰好是一个完全有序的集合.即使增加正负无穷大也能保持实数的整数排序.为什么这个奇怪的选择在Rust?
此限制意味着通用排序/搜索算法只能假设数字的部分排序.IEEE 754标准似乎提供了总排序谓词.
NaN在通用代码中是如此多的问题吗?
如果你有,Vec<u32>你会使用该slice::binary_search方法.
由于我不理解的原因,f32并且f64没有实施Ord.由于基本类型来自标准库,因此您无法Ord自己实现它们,因此您似乎无法使用此方法.
你怎么能有效地做到这一点?
我真的必须包装f64一个包装器结构并Ord在其上实现吗?这样做似乎非常痛苦,并且涉及大量transmute不安全地来回传播数据块,实际上是没有理由的.
我理解为什么浮点数没有实现,Ord但是当我想要懒惰并使用迭代器时,这对我没有特别的帮助.
是否有一种解决方法或一种简单的方法来获取包含浮点数的迭代器的最小值/最小值/ min_by?
我知道可以排序(这很慢)或将其包装在另一种类型中并实现所需的交易(这是冗长的),但我希望有一些更优雅的东西.
我有这样的结构
struct Point {
pub x: i32,
pub y: i32,
}
impl Point {
fn new(x: i32, y: i32) -> Self {
Point { x, y }
}
}
Run Code Online (Sandbox Code Playgroud)
还有像这样的数组
[Point::new(1, 1), Point::new(4, 2), Point::new(2, 9)];
Run Code Online (Sandbox Code Playgroud)
如何point.x从此阵列中拉出最大的项目?
我想使用基于某个键max_by_key从f64s的向量中获取最大值。这是一个简单的例子,用一个小向量abs作为关键:
let a: Vec<f64> = vec![-3.0, 0.2, 1.4];
*a.iter().max_by_key(|n| n.abs()).unwrap()
Run Code Online (Sandbox Code Playgroud)
但是,由于f64没有实现Ord,我得到
let a: Vec<f64> = vec![-3.0, 0.2, 1.4];
*a.iter().max_by_key(|n| n.abs()).unwrap()
Run Code Online (Sandbox Code Playgroud)
同样,sort_by_key失败并出现相同的错误:
a.sort_by_key(|n| n.abs())
Run Code Online (Sandbox Code Playgroud)
我知道我可以绕过偏序限制来对浮点数向量进行排序 sort_by
b.sort_by(|m, n| m.partial_cmp(n).unwrap_or(Less))
Run Code Online (Sandbox Code Playgroud)
但这必须在一个向量上调用b,我已经abs为 的每个元素计算了键(在这种情况下)a,然后我必须返回并找到 的相应元素a,这看起来既复杂又缓慢。随着列表中项目数量的增加,我想尽量减少通过数据的次数。
有什么解决方法吗?
我想访问 a 中最大元素旁边的元素Vec<i32>。我正在寻找这样的东西:
let v = vec![1, 3, 2];
let it = v.iter().max_element();
assert_eq!(Some(&2), it.next());
Run Code Online (Sandbox Code Playgroud)
在 C++ 中,我会使用std::max_element然后只增加迭代器(有或没有边界检查,取决于我此刻的冒险精神)。Rustmax只返回对元素的引用,这对我的用例来说不够好。
我想出的唯一解决方案是使用enumerate获取项目的索引 - 但与 C++ 方式相比,这似乎是手动且繁琐的。
我更喜欢标准库中的东西。
这个例子是简化的——我实际上想附加到最高值,然后从那个点循环整个容器(可能是cycle()或类似的东西)。