【发布时间】:2019-09-25 16:10:19
【问题描述】:
我想访问Vec<i32> 中最大元素旁边的元素。我正在寻找这样的东西:
let v = vec![1, 3, 2];
let it = v.iter().max_element();
assert_eq!(Some(&2), it.next());
在 C++ 中,我会使用 std::max_element,然后只增加迭代器(有或没有边界检查,取决于我目前的冒险程度)。 Rust max 只返回对元素的引用,这对我的用例来说还不够好。
我想出的唯一解决方案是使用enumerate 来获取项目的索引 - 但与 C++ 方式相比,这似乎是手动且繁琐的。
我更喜欢标准库中的东西。
这个例子被简化了——我实际上想附加到最高值,然后从那个点循环整个容器(可能使用cycle() 或类似的东西)。
【问题讨论】:
-
“有或没有边界检查,取决于我现在的冒险精神”还是从不这样做?那将是愚蠢的
-
如果你只想要一个值,为什么要使用迭代器?为什么不使用 enumerate 和 fold 计算索引(如果需要,还可以计算值)?
-
C++ 迭代器就像游标; Rust 迭代器更紧密地基于 Python 模型。您可能需要更加努力地考虑需要
max_element的算法(我发现使用类似 Rust 的迭代器比类似 C++ 的迭代器更容易解决大多数问题,一旦您做出了心理转换)。 -
@trentcl 感觉像是对我的回答 ;-)
-
@Denys 让反对票来吧,但我并没有征求意见,为什么我想在这种简单的情况下这样做。我在问如何,我很高兴得到一个解释或简单的答案你不能在 Rust 中做到这一点。该示例已简化 - 我实际上想附加到最高值,然后从该点循环整个容器(可能使用
cycle()或类似的东西)。