如何检查一个元素是否在向量中。

104

如何检查一个元素是否存在于向量中?

let n= vec!["-i","mmmm"];
if "-i" in n { 
    println!("yes");
} else {
    println!("no");

我猜想需要将这个放入循环中,然后执行if "-i" in x,其中x是迭代变量。但我希望有一个方便的方法可用,或者我弄错了语法,有一种类似的方法可以实现。

2个回答

138

Vec 上有 contains 方法 (https://doc.rust-lang.org/std/vec/struct.Vec.html#method.contains)。

示例:

let n = vec!["-i","mmmm"];

if n.contains(&"-i") { 
    println!("yes");
} else {
    println!("no");
}

这有点限制性,例如,如果x的类型是&str,则不允许检查Vec<String>是否包含x。在这种情况下,您将需要使用@harmic描述的.iter().any(...)方法。


103

虽然你可以构建一个循环,但更简单的方法是使用迭代器的any方法来遍历向量。

any方法接受一个返回true或false的闭包。该闭包依次对每个项目进行调用,直到找到返回true的项目为止。请注意,迭代器返回对值的引用(因此在|&i|中有&)。

let n= vec!["-i","mmmm"];

if n.iter().any(|&i| i=="-i") {
    println!("Yes");
}

由于any针对迭代器进行操作,因此它可以与任何类型的容器一起使用。迭代器上有大量类似的方法,如allfind等。请参阅迭代器的标准库文档。


只是猜测:这种方法的复杂度可能是O(n)。我看不出有任何改进的方法。而对于某些数据结构来说,contains可以实现为O(log n) - ctrl-alt-delor

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