将 std::cmp::Reverse 与 binary_search_by_key 一起使用

Una*_*dra 3 rust

怎么std::cmp::Reversebinary_search_by_key?例子: Rust-Playground

Rust 的 Vec::binary_search_by_key 文档

假设切片按键排序,例如 sort_by_key使用相同的键提取函数。

在下面的最小示例中,我使用了相同的提取函数——但没有运气。

use std::cmp::Reverse;

fn main() {
    let mut v = vec![1, 2, 3, 4, 5];

    v.sort_by_key(|&num| Reverse(num));
    println!("{:?}", v);
    let index = v.binary_search_by_key(&1, |&num| Reverse(num));
    println!("Res: {:?}", index);
}
Run Code Online (Sandbox Code Playgroud)

这抱怨不匹配的类型:“预期的整数,找到结构std::cmp::Reverse”。

error[E0308]: mismatched types
 --> src/main.rs:8:51
  |
8 |     let index = v.binary_search_by_key(&1, |&num| Reverse(num));
  |                                                   ^^^^^^^^^^^^ expected integer, found struct `std::cmp::Reverse`
  |
  = note: expected type `{integer}`
           found struct `std::cmp::Reverse<{integer}>`

Run Code Online (Sandbox Code Playgroud)

Pri*_*six 5

仔细检查函数签名会给出答案。

pub fn binary_search_by_key<'a, B, F>(
    &'a self,
    b: &B,
    f: F
) -> Result<usize, usize> where
    B: Ord,
    F: FnMut(&'a T) -> B, 
Run Code Online (Sandbox Code Playgroud)

B是函数的返回值,也是第一个参数(之后&self)。

因此,我们还必须添加Reverse到第一个参数:

v.binary_search_by_key(&Reverse(1), |&num| Reverse(num))
Run Code Online (Sandbox Code Playgroud)