Rust 如何在遍历容器时修改它?

Rust 如何在遍历容器时修改它?,rust,iteration,Rust,Iteration,我指的是容器本身,而不是容器的内容物。我想插入、删除、附加等。我对我的问题做了如下抽象: fn f() { let mut numbers = vec![10, 11, 12, 14, 15]; for index in 0..numbers.len() { process(numbers[index]); if numbers[index] == 12 { numbers.insert(index + 1);

我指的是容器本身,而不是容器的内容物。我想插入、删除、附加等。我对我的问题做了如下抽象:

fn f() {
    let mut numbers = vec![10, 11, 12, 14, 15];

    for index in 0..numbers.len() {
        process(numbers[index]);

        if numbers[index] == 12 {
            numbers.insert(index + 1);
        }
    }
}
函数
f
可以工作,但它在容器上循环的次数不会随着容器大小的变化而变化

fn g() {
    let mut numbers = vec![10, 11, 12, 14, 15];

    for (index, num) in numbers.iter().enumerate() {
        process(num);

        if num == 12 {
            numbers.insert(index + 1);
        }
    }
}
函数
g
看起来是实现这一点的最惯用的方法,但由于出现非法的可变借用引用,它无法编译

fn h() {
    let mut numbers = vec![10, 11, 12, 14, 15];

    let mut index = 0;
    while index < numbers.len() {
        process(numbers[index]);

        if numbers[index] == 12 {
            numbers.insert(index + 1);
        }

        index += 1;
    }
}
fn h(){
让mut number=vec![10,11,12,14,15];
设mut指数=0;
而索引

函数
h
是唯一有效的版本,但它似乎不是正确的方法。我基本上只是用
while
循环模拟C风格的
for
循环。我希望有人知道一种更简洁的编写方法,最好使用
for
循环。

在迭代集合时更改集合通常是个坏主意。Rust的集合迭代器为您提供了对项的引用,以获得最大效率。如果删除或添加了一个值,则可能会使所持有的引用无效,从而导致内存不安全。删除也可能导致“丢失”元素。使用索引和while循环是一个正确的解决方案,尽管我喜欢将自己推到一个临时向量。@Shepmaster看起来您标记为我的问题副本的大多数问题实际上是不同的问题,其答案与我的问题不兼容。实际上,只有第二个问题包含了一个相关的答案,这几乎是我上一个例子的复制品,对我一点帮助都没有。只有第二个问题包含了一个相关的答案,这几乎是我上一个例子的复制品-这是因为你的上一个例子是你如何做到这一点,当你真正需要的时候。所有其他人都在谈论你关于以任意方式修改任意集合的一般标题,并且是为了所有其他人,他们将通过任何途径发现你的问题。就这些问题对其他人有用这一点而言,这是足够公平的。我仍然有点失望,C/C++的解决方案比生锈的解决方案更干净。你可能会觉得很有启发性。