我想访问 a 中最大元素旁边的元素Vec<i32>。我正在寻找这样的东西:
let v = vec![1, 3, 2];
let it = v.iter().max_element();
assert_eq!(Some(&2), it.next());
Run Code Online (Sandbox Code Playgroud)
在 C++ 中,我会使用std::max_element然后只增加迭代器(有或没有边界检查,取决于我此刻的冒险精神)。Rustmax只返回对元素的引用,这对我的用例来说不够好。
我想出的唯一解决方案是使用enumerate获取项目的索引 - 但与 C++ 方式相比,这似乎是手动且繁琐的。
我更喜欢标准库中的东西。
这个例子是简化的——我实际上想附加到最高值,然后从那个点循环整个容器(可能是cycle()或类似的东西)。
小智 8
一个简单的解决方案是使用折叠,以下代码生成“最大数字是:99”
let vv:Vec<i32> = (1..100).collect();
let largest = vv.iter().fold(std::i32::MIN, |a,b| a.max(*b));
println!("largest {} ", largest);
Run Code Online (Sandbox Code Playgroud)
C++ 迭代器与 Rust 迭代器不同。Rust 迭代器是只进的,只能被遍历一次。C++ 迭代器可以被认为是游标。请参阅Rust 迭代器和 C++ 迭代器之间的主要区别是什么?更多细节。
为了以最通用的方式实现您的目标,您必须遍历整个迭代器以找到最大值。在此过程中,每次找到新的最大值时都必须复制迭代器。最后可以返回最大值之后的点对应的迭代器。
trait MaxElement {
type Iter;
fn max_element(self) -> Self::Iter;
}
impl<I> MaxElement for I
where
I: Iterator + Clone,
I::Item: PartialOrd,
{
type Iter = Self;
fn max_element(mut self) -> Self::Iter {
let mut max_iter = self.clone();
let mut max_val = None;
while let Some(val) = self.next() {
if max_val.as_ref().map_or(true, |m| &val > m) {
max_iter = self.clone();
max_val = Some(val);
}
}
max_iter
}
}
fn main() {
let v = vec![1, 3, 2];
let mut it = v.iter().max_element();
assert_eq!(Some(&2), it.next());
}
Run Code Online (Sandbox Code Playgroud)
也可以看看:
我实际上想附加到最高值,然后从那个点循环整个容器(可能带有
cycle()或类似的东西)。
在那种情况下,我会尝试更明显:
fn index_of_max(values: &[i32]) -> Option<usize> {
values
.iter()
.enumerate()
.max_by_key(|(_idx, &val)| val)
.map(|(idx, _val)| idx)
}
fn main() {
let v = vec![1, 3, 2];
let idx = index_of_max(&v).unwrap_or(0);
let (a, b) = v.split_at(idx);
let mut it = b.iter().chain(a).skip(1);
assert_eq!(Some(&2), it.next());
}
Run Code Online (Sandbox Code Playgroud)
也可以看看:
| 归档时间: |
|
| 查看次数: |
2916 次 |
| 最近记录: |