如何获得 Rust 中最大值元素的迭代器?

Leś*_*ajs 1 iterator rust

我想访问 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)


She*_*ter 5

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 次

最近记录:

6 年,7 月 前