我有一个辅助函数,可在向量中找到中间元素:
fn get_middle<T>(elements: Vec<T>) -> T {
elements[elements.len() / 2]
}
这使我们可以像这样使用助手:
get_middle(vec![1, 2, 3])
还有其他一些也可以索引并具有长度的结构。通过仅使用Vec<T>
,我们确实缩小了此帮助程序的用途。例如,Range
不能传入。行为像矢量的自定义数据类型也不能。
我可以用来约束elements
使其具有以下特征的最一般特征是什么:
get_middle(vec![1, 2, 3])
// as well as...
get_middle(0..3)
我回想起阅读时可以将范围转换为切片的情况,但事实并非如此。将类型更改为&[T]
会产生错误,尝试通过强制转换<&[T]>::from(0..3)
来遵循其建议似乎无效。查看Range
和Vec
的文档,似乎Index
特质是我想要的一半,但似乎没有len()
的特质
答案 0 :(得分:4)
您想要ExactSizeIterator
与list<int> l
unordered_map<int, list<int>::iterator> m;
:
IntoIterator
请注意,如果迭代器的源支持fn get_middle<T, U>(elements: U) -> Option<T>
where
U: IntoIterator<Item = T>,
U::IntoIter: ExactSizeIterator,
{
let mut it = elements.into_iter();
let len = it.len();
it.nth(len / 2)
}
fn main() {
assert_eq!(get_middle(vec![1, 2, 3]), Some(2));
assert_eq!(get_middle(0..3), Some(1));
}
(例如,切片或范围),则会将其实现为随机访问。