在 Rust 中比较 Vec 和 Range

4

我想检查一个Vec是否等于[0, 1, 2, ...]。我已经尝试了各种变体:

vec == &(0..vec.len())

但是它们似乎都不起作用。我只需要手写一个循环吗?

1个回答

8
你可以使用迭代器将 Vec<T> (或更一般地,一个切片[T])与一个范围(Playground)进行比较:
let v = vec![0, 1, 2, 3, 4];

if v.iter().cloned().eq(0..v.len()) {
    println!("v contains 0..5");
} else {
    println!("v doesn't contain 0..5");
}

让我们剖析重要部分:

v.iter().cloned().eq(0..v.len())
  • v.iter()创建一个迭代器,迭代器中的元素是向量中元素的引用(Iterator<Item = &{integer}>)。
  • .cloned()克隆迭代器中的每个元素,从引用变为拥有的值。这是必需的,因为我们无法将&{integer}{integer}进行比较。幸运的是,克隆一个简单的整数基本上是免费的。现在我们有了Iterator<Item = {integer}>
  • .eqIterator的方法,它将迭代器与另一个迭代器进行比较。
  • 0..v.len()是从0(包含)到v.len()(不包含)的范围。这样的范围实现了Iterator

我刚刚纠正了我的问题(我在两个地方有所不同,如果我想要0..len-1,还是1..len。我想要0..len-1)。您可能希望将您的答案与此同步(抱歉!) - Chris Jefferson
@ChrisJefferson 已更新。 - Lukas Kalbertodt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接