相关疑难解决方法(0)

根据某些条件从Vec中删除元素

我的代码看起来像这样:

struct Bar {
    i: i32,
}

struct Foo {
    v: Vec<Bar>,
}

impl Foo {
    fn foo(&mut self) {
        self.v.drain(self.v.iter().filter(|b| b.i < 10));
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,Bar不允许复制或克隆.

我想删除所有Bar不满足该条件的s.最初我以为我可以迭代它们并调用remove但是我不允许有两个可变借用或一个可变借用,如果存在一个完全有意义的不可变借用.

我想最简单的事情是只clone,filtercollect,但我不能克隆或复制.

我该怎么做?

rust

5
推荐指数
2
解决办法
1577
查看次数

根据同一Vec的其他元素删除Vec元素的最佳方法

我有一组集合,我想删除所有集合,这些集合是向量中其他集合的子集.例:

a = {0, 3, 5}
b = {0, 5}
c = {0, 2, 3}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我想删除b,因为它是一个子集a.我使用"哑"n²算法很好.

可悲的是,让它与借用检查器一起工作是非常棘手的.我想出的最好的是(游乐场):

let mut v: Vec<HashSet<u8>> = vec![];

let mut to_delete = Vec::new();
for (i, set_a) in v.iter().enumerate().rev() {
    for set_b in &v[..i] {
        if set_a.is_subset(&set_b) {
            to_delete.push(i);
            break;
        }
    }
}

for i in to_delete {
    v.swap_remove(i);
}
Run Code Online (Sandbox Code Playgroud)

(注意:上面的代码不正确!有关详细信息,请参阅注释)

我看到一些缺点:

  • 我需要一个额外的分配矢量
  • 也许有比swap_remove经常打电话更有效的方式
  • 如果我需要保留订单,我不能使用swap_remove,但必须使用remove哪个很慢

有一个更好的方法吗?我不只是询问我的用例,而是关于标题中描述的一般情况.

rust borrow-checker

4
推荐指数
1
解决办法
2028
查看次数

标签 统计

rust ×2

borrow-checker ×1