为什么初始化向量的向量 (Vec<Vec<T>>) 需要 T 而不是 Vec<T>?

Edr*_*rae 2 rust

我错过了向量向量的初始化。在第一种方法中,我尝试了以下代码:

let mut landFirst: Vec<Vec<char>> = Vec::with_capacity(width);
for v in landFirst {
    v.push(Vec::with_capacity(height));
}
Run Code Online (Sandbox Code Playgroud)

但它失败了:

let mut landFirst: Vec<Vec<char>> = Vec::with_capacity(width);
for v in landFirst {
    v.push(Vec::with_capacity(height));
}
Run Code Online (Sandbox Code Playgroud)

为什么?v由 组成Vec<char>,而不是由 组成char。

它适用于以下代码:

let mut landFirst: Vec<Vec<char>> = Vec::with_capacity(width);
for cpt in 0..width {
    landFirst.insert(cpt, Vec::with_capacity(height));
}
Run Code Online (Sandbox Code Playgroud)

你能启发我吗?

Luk*_*odt 5

为什么?v由 组成Vec<char>,而不是由 组成char。

让我们检查一下的类型v:

for v in land_first {
    let () = v;
}
Run Code Online (Sandbox Code Playgroud)

这导致:

for v in land_first {
    let () = v;
}
Run Code Online (Sandbox Code Playgroud)

所以v有类型Vec<char>。为什么?好吧,for v in land_first您将遍历land_first. 的元素是land_first什么?正确:Vec<char>。

你混淆的另一件事:Vec::with_capacity()只保留内存,但实际上并不插入元素。Vec::with_capacity(10).len()是 0!您需要使用push()或insert()实际插入元素。

这也暗示了您方法的核心问题:您认为向量中的字符是什么?您从未指定要插入的字符。没有明确的默认值总是有用的,对吧?


那么,您将如何理想地初始化您的向量向量?有一个有用的vec![]宏:

const INIT_CHAR: char = '?';
let land_first = vec![vec![INIT_CHAR; height]; width];
Run Code Online (Sandbox Code Playgroud)

另请注意:

  • 我换landFirst到land_first。在 Rust 中,变量名使用snake_case.
  • 我删除了显式类型注释:这些在 Rust 中通常不是必需的。