#排序 #借用 # #向量 #元组 #错误 #字母

sort-by-borrowed-key

增加了两个按借用键排序的便利方法

1个稳定版本

1.0.0 2020年5月26日

#2729Rust模式

LGPL-3.0-or-later

7KB

一个提供两个额外排序方法的crate

假设你有一个元组的向量,你希望按其中一个元素进行排序(可能通过enumerate或zip迭代器方法获得,然后收集到Vec中)。现在,如果你写下以下内容,你会得到生命周期错误

let mut letters = vec![
    (1, "C".to_string()), 
    (2, "B".to_string()),
    (3, "B".to_string()),
    (4, "A".to_string())
];
letters.sort_by_key(|x| &x.1);
println!("Letters: {:?}", letters);

所以你可能尝试不借用,但然后你意识到String不是Copy

let mut letters = vec![
    (1, "C".to_string()), 
    (2, "B".to_string()),
    (3, "B".to_string()),
    (4, "A".to_string())
];
letters.sort_by_key(|x| x.1);
println!("Letters: {:?}", letters);

所以这失败了,因为你将要从数组中移动出去!你不想为比较这些字符串而不得不昂贵的克隆所有这些字符串。这正是这个库发挥作用的地方

use sort_by_borrowed_key::SortByBorrowedKey;
let mut letters = vec![
    (1, "C".to_string()), 
    (2, "B".to_string()),
    (3, "B".to_string()),
    (4, "A".to_string())
];
letters.sort_by_borrowed_key(|x| &x.1);
let expected = vec![
    (4, "A".to_string()), 
    (2, "B".to_string()),
    (3, "B".to_string()),
    (1, "C".to_string())
];
assert_eq!(letters, expected);

就是这样!该crate还增加了一个不稳定的排序版本的同一种方法,sort_unstable_by_borrowed_key,它更快,但可能会改变相等元素的顺序(请参阅[T]::sort_unstable的文档)。

非常感谢freenode IRC上danieldg##rust上的帮助,包括一些出色的示例,让我理解如何编写这个库!

无运行时依赖