Rust 如何在不循环的情况下计算向量中具有某个值的元素?

Rust 如何在不循环的情况下计算向量中具有某个值的元素?,rust,Rust,如何使用特定值(例如91)计算向量中的元素(例如[91,55,77,91]),而不使用循环(如下所示) fn count\u eq(vec:&vec,num:i64)->i64{ 设mut计数器=0; 因为我在vec{ 如果*i==num{ 计数器+=1; } } 返回计数器; } fn main(){ 设v=vec![91,55,77,91]; println!(“计数91:{}”,计数等式(&v,91)); } 您可以使用它,然后: 这个链接解决了我对双重引用的困惑:“因为传递给filter

如何使用特定值(例如
91
)计算向量中的元素(例如
[91,55,77,91]
),而不使用循环(如下所示)

fn count\u eq(vec:&vec,num:i64)->i64{
设mut计数器=0;
因为我在vec{
如果*i==num{
计数器+=1;
}
}
返回计数器;
}
fn main(){
设v=vec![91,55,77,91];
println!(“计数91:{}”,计数等式(&v,91));
}
您可以使用它,然后:


这个链接解决了我对双重引用的困惑:“因为传递给
filter()
的闭包接受一个引用,并且许多迭代器在引用上迭代,这可能导致一种混乱的情况,闭包的类型是双重引用”I microbenchmarked
filter().count()
fold()
后者的速度是前者的两倍。对于
(1..1|000|000).filter(|x|x%2==0).count()
我得到167317 ns/iter(+/-9497),对于
(1..1|000).fold(0,| acc,x |如果x%2==0{acc+1}否则{acc})
我得到74451 ns/iter(+/-3860)。这是不幸的,因为对我来说,
filter().count()
更具可读性。@RafałCieślak FWIW我也这么做了,发现性能几乎没有什么不同。有一个针对
count
的特例实现允许这样做:所以我不知道您的基准测试的细节,但我倾向于说它有缺陷。@TamásSzelei感谢您提供的信息!很高兴知道有一个特殊的例子,它确实表明我的基准有缺陷。
fn count_eq(vec: &Vec<i64>, num: i64) -> i64 {
    let mut counter = 0;
    for i in vec {
        if *i == num {
            counter += 1;
        }
    }
    return counter;
}

fn main() {
    let v = vec![91, 55, 77, 91];
    println!("count 91: {}", count_eq(&v, 91));
}
fn main() {
    let v = vec![91, 55, 77, 91];
    println!("count 91: {}", v.iter().filter(|&n| *n == 91).count());
}