作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这不是How can I co-sort two Vecs based on the values in one of the Vecs?的副本,因为permutation
crate 的实现分配了。
如何在不分配的情况下根据另一个片的内容对一个片进行排序?
slice1 = [
AAA, BBB, CCC, DDD
]
slice2 = [
12, -3, 6, 17
]
结果:
[BBB, CCC, AAA, DDD]
slice1
和
slice2
都不太大(整数,最多约1 KiB,通常小得多),但是这种情况经常可以完成。不需要保留
slice2
,因此可以通过对
slice2
排序并同时在
slice1
上执行相同的操作来实现,但是我做的任何排序实现都比标准库实现的性能差。
最佳答案
可通过以下三种方法访问标准库排序算法:
[T]::sort
[T]::sort_by
(以FnMut(&T, &T) -> Ordering
作为编译器)[T]::sort_by_key
(采用FnMut(&T) -> K
)&T
,将其转换为原始指针,从中减去片基,然后再加上tada:您就有索引!使用索引,您可以查看另一个数组。 (编辑:不,请参见注释。)但是,这仅在算法交换前两个元素之前有效。您还必须复制整数数组中的所有交换。而且标准库根本不向您提供有关交换的“通知”。
let mut vec = slice2.iter().zip(slice1).collect::<Vec<_>>();
vec.sort();
这样,您将得到
[(-3, BBB), (6, CCC), (12, AAA), (17, DDD)]
作为结果。当然,您可以轻松地从中仅选择第二个元素。当然,还有很多替代解决方案。
关于sorting - 根据另一个切片中的键对切片进行排序,而无需分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62871380/
我是一名优秀的程序员,十分优秀!