我想要一个(Key,Type)的排序向量,它只按Key排序。
我想出了以下代码:
struct SortedVec<K, T> {
data: Vec<(K, T)>
}
impl<K: Ord, T> SortedVec<K, T> {
fn new() -> SortedVec<K, T> {
SortedVec { data: Vec::new() }
}
fn add(&mut self, k: K, t: T) {
self.data.push((k, t));
self.data.sort_by(|a, b| a.0.cmp(&b.0));
}
fn find<P>(&self, predicate: P) -> Option<&(K, T)> where P: FnMut(&(K, T)) -> bool {
self.data.iter().find(predicate)
}
}
但是这不会编译时出现以下错误:
anon>:16:30: 16:45 error: the trait `for<'r> core::ops::FnMut<(&'r &(K, T),)>` is not implemented for the type `P` [E0277]
anon>:16 self.data.iter().find(predicate)
^~~~~~~~~~~~~~~
<anon>:16:30: 16:45 error: the trait `for<'r> core::ops::FnOnce<(&'r &(K, T),)>` is not implemented for the type `P` [E0277]
<anon>:16 self.data.iter().find(predicate)
^~~~~~~~~~~~~~~
error: aborting due to 2 previous errors
playpen: application terminated with error code 101
我找不到类型的错误&#39; P&#39;
我该如何解决?
答案 0 :(得分:4)
让我们比较P
上的界限和需要编译器的界限:
// P
FnMut( &(K, T)) -> bool
// required
for<'r> FnMut(&'r &(K, T)) -> bool
如果更改where
子句以匹配编译器要求的签名,则它可以正常工作(see here)。
我相信额外的引用(和生命周期)是通过使用iter
引入的,因此链接到迭代器的生命周期,但是不要接受我的话。
我想指出,Vec
有一个binary_search_by
,它必然比线性find
更有效:
fn binary_search_by<F>(&self, f: F) -> Result<usize, usize>
where F: FnMut(&T) -> Ordering
您可能希望使用它,因为您遇到了排序它的麻烦。
答案 1 :(得分:2)
好吧,编译器已经给你提示修复了!您需要更改
中的“where”子句fn find<P>(&self, predicate: P) -> Option<&(K, T)>
where P: FnMut(&(K, T)) -> bool
到
fn find<P>(&self, predicate: P) -> Option<&(K, T)>
where for<'r> P: FnMut(&'r &(K, T)) -> bool