我希望有一个点的容器,在运行时,按照到某个给定点的距离排序,在其他语言中,我可以为容器提供一个自定义的比较函数,然而,我知道这在rust中是不可能的。
请考虑以下代码问题:
/// distance between two points
fn distance(a: &(f32, f32), b: &(f32, f32)) -> f32 {
((a.0-b.0)*(a.0-b.0) + (a.1-b.1)*(a.1-b.1)).sqrt()
}
fn main() {
let origin = (1, 1); // assume values are provided at runtime
let mut container = BTreeSet::new(); // should be sorted by distance to origin
container.insert((1 ,9));
container.insert((2 ,2));
container.insert((1 ,5));
}
在插入之后,我希望容器被排序为[(2,2),(1,5),(1,9)]
,这个例子使用了BTreeSet
,我并不坚持使用它,但是感觉它最接近我的需要。
我不想要一个Vec
,我必须在每个insert()
之后手动求助。
那么,如何连接distance()
、origin
和container
,最好是不依赖第三方?
1条答案
按热度按时间bejyjqdl1#
我不认为有一种好方法可以做到这一点,除非将原点与每个点沿着存储,以便您可以在
Cmp
实现中使用它。