如何在不使用集合的情况下修改它?

How do I modify a collection without consuming it?

我想在归还之前就地修改一个集合:

fn main() {
    println!("{:?}", compute()); // should print [[2, 1, 0], [5, 4, 3]]
}

// u8 is just a placeholder, so impl Copy is considered cheating :)
fn compute() -> Vec<Vec<u8>> {
    let a = vec![0, 1, 2];
    let b = vec![3, 4, 5];

    let mut result = Vec::new();
    result.push(a);
    result.push(b);

    // avoids allocations from:
    //
    // result.iter()
    //     .map(|r| {
    //         r.reverse()
    //         r
    //     })
    //     .collect::<Vec<_>>()
    result.into_iter().for_each(|mut r| r.reverse());

    // errors out: the collection was consumed the line above
    result
}

一个集合已经分配了 Vec::new(),所以在这里分配第二个集合似乎是一种浪费。我假设这就是 .collect() 所做的。

  1. 如何避免分配过多?
  2. 有什么简单的方法可以知道发生了多少分配?在 golang 中,它就像 go test -bench=. 一样简单,但在 Rust 中我找不到任何类似的东西。

Link to playground

您需要对每个内部向量使用 &mut,为此您可以只使用 iter_mut,它使用 &mut Self 而不是 Self 作为外部向量矢量.

// u8 is just a placeholder, so impl Copy is considered cheating :)
fn compute() -> Vec<Vec<u8>> {
    let a = vec![0, 1, 2];
    let b = vec![3, 4, 5];

    let mut result = Vec::new();
    result.push(a);
    result.push(b);

    result.iter_mut().for_each(|r| r.reverse());

    result
}

Playground