Vector 在Rust中,是否有方法仅对容器的一部分执行retain()?

Vector 在Rust中,是否有方法仅对容器的一部分执行retain()?,vector,rust,primes,Vector,Rust,Primes,我学习Rust是为了好玩,在编写返回第n个素数的函数时,我意识到我的解决方案感觉很不雅观和浪费 我遍历了可能的素数的整个列表,而我只想遍历其中未经验证的部分。在使用retain()函数时,有没有办法做到这一点 我的主要问题是,我认为retain()函数是为Vec实现的,而不是为切片实现的。我试图查看slice文档以获得进一步的想法,但没有找到任何想法 这是代码 let mut prime_list:Vec=(2..n).collect(); 设muti:usize=0; 而我u32{ 设mut

我学习Rust是为了好玩,在编写返回第n个素数的函数时,我意识到我的解决方案感觉很不雅观和浪费

我遍历了可能的素数的整个列表,而我只想遍历其中未经验证的部分。在使用retain()函数时,有没有办法做到这一点

我的主要问题是,我认为retain()函数是为Vec实现的,而不是为切片实现的。我试图查看slice文档以获得进一步的想法,但没有找到任何想法

这是代码

let mut prime_list:Vec=(2..n).collect();
设muti:usize=0;
而我|x | x这并不能完全解决你想要的问题,但我想我应该尝试以一种更“生锈的方式”来做这件事,因为有人写过一段时间的生锈

let mut primes = Vec::new();

for e in 2..100 {
    if primes.iter().all(|p| e % p != 0) {
        primes.push(e);
    }
}

println!("{:?}", primes);
我将素数存储在一个单独的向量中,因为我想在进行过程中添加到它。这确实比在迭代向量时尝试使用retain从向量中删除某些元素要优雅得多

如果你真的想变得有趣,你可以使用
和_capacity
进行一些优化,并在得到第n个素数后停止

fn get_nth_prime(n: usize) -> u32 {
    let mut primes = Vec::with_capacity(n);
    let mut e = 2;

    while primes.len() < n {
        if primes.iter().all(|p| e % p != 0) {
            primes.push(e);
        }

        e += 1;
    }

    primes[n - 1]
}
fn获取第n个素数(n:usize)->u32{
设mut primes=Vec::具有_容量(n);
设mute=2;
而primes.len()
这并不能完全解决您想要的问题,但我想作为一个写过rust一段时间的人,我应该尝试用一种更“生锈的方式”来做这件事

let mut primes = Vec::new();

for e in 2..100 {
    if primes.iter().all(|p| e % p != 0) {
        primes.push(e);
    }
}

println!("{:?}", primes);
我将素数存储在一个单独的向量中,因为我想在进行过程中添加到它。这确实比在迭代向量时尝试使用retain从向量中删除某些元素要优雅得多

如果你真的想变得有趣,你可以使用
和_capacity
进行一些优化,并在得到第n个素数后停止

fn get_nth_prime(n: usize) -> u32 {
    let mut primes = Vec::with_capacity(n);
    let mut e = 2;

    while primes.len() < n {
        if primes.iter().all(|p| e % p != 0) {
            primes.push(e);
        }

        e += 1;
    }

    primes[n - 1]
}
fn获取第n个素数(n:usize)->u32{
设mut primes=Vec::具有_容量(n);
设mute=2;
而primes.len()
迭代器是否可以工作?我不太了解您的素数算法。非常感谢您的快速响应!我不确定筛选器()是否可以工作,因为我想在while循环之外变异并返回素数列表。如果我使用筛选器()我不必收集()结果并以某种方式重新分配给prime_list变量?我不确定是否可以重新分配…但我可以很快尝试。好的,我更新了它,但我不确定这个解决方案是否更好。我用新的工作版本更新了帖子。我指的是更接近
prime_list[I...iter().filter(|{…})。collect:()
用于收集我刚刚扫描过的向量部分,但我想收集不需要扫描的部分,以及这个过滤部分。因此在编辑中,我想我会做一些类似于你建议的事情,这里
rust right.iter().filter(…)
,但因为我想要两者,所以我首先在()然后将它们链接在一起。出于某种原因,因为它是引用上的一个切片,所以在执行collect()之前,我必须将每个元素都更改为值而不是引用。是否需要使用迭代器工作?我不太了解你的素数算法。非常感谢你的快速响应!我不确定是否有筛选器()这样就行了,因为我想在while循环之外变异并返回prime_列表结果并以某种方式重新分配给prime_list变量?我不确定是否可以重新分配…但我可以很快尝试。好的,我更新了它,但我不确定这个解决方案是否更好。我用新的工作版本更新了帖子。我指的是更接近
prime_list[I...iter().filter(|{…})。collect:()
用于收集我刚刚扫描过的向量部分,但我想收集不需要扫描的部分,以及这个过滤部分。因此在编辑中,我想我会做一些类似于你建议的事情,这里
rust right.iter().filter(…)
,但因为我想要两者,所以我首先在()然后将它们链接在一起。出于某种原因,因为它是引用的一部分,所以在执行collect()之前,我必须将每个元素更改为值而不是引用。太棒了。谢谢-可能是我使用filter()或retain()的方法缩小我可能的素数列表是不正确的。我仍然觉得,在编辑过程中必须有一种方法不会变得如此模糊。但我将对此进行更多研究。谢谢!太棒了。谢谢-这可能是我使用filter()或retain()的方法缩小我可能的素数列表是不正确的。我仍然觉得,在编辑过程中必须有一种方法不会如此模糊。但我会进一步研究。谢谢!