如何用值 0 到 n 初始化向量?

Tho*_*rge 16 vector rust

如何在 Rust 中初始化从0到 的向量?n除了创建空向量并push在循环内调用之外,还有其他方法可以做到这一点吗?

我更喜欢单线。

Joh*_*ica 20

一个范围可以被收集到一个向量中:

pub fn sequence(n: u32) -> Vec<u32> {
    (0..n).collect()
}
Run Code Online (Sandbox Code Playgroud)

操场

  • 更好(IMO):`Vec::from_iter(0..n)` (8认同)
  • @kmdreko 由于 `FromIterator` 是自 2021 版以来的前奏,我预计它会有更多的用法(我现在使用它更多,而且我也在其他人的代码中看到了这一点)。当您不对可迭代对象执行任何转换,只是转换为另一个容器时,它会更短:“Container::from_iter(v)”而不是“v.into_iter().collect::&lt;Container&gt;()”。 (5认同)
  • 我想你会看到 `collect()` 比 `from_iter()` 使用得更频繁,因为它可以附加到现有的迭代器链上,但从功能上来说它们做同样的事情。 (2认同)

at5*_*321 6

您可以按照以下方式将其作为单行代码执行:

let n = 4;

let v: Vec<i32> = (0..n).collect();  // the last element will be n-1
assert_eq!(v, vec![0, 1, 2, 3]);

let v: Vec<i32> = (0..=n).collect();  // the last element will be n
assert_eq!(v, vec![0, 1, 2, 3, 4]);
Run Code Online (Sandbox Code Playgroud)

或者,另一种选择:

let v: Vec<i32> = Vec::from_iter(0..n);  // the last element will be n-1
assert_eq!(v, vec![0, 1, 2, 3]);

let v: Vec<i32> = Vec::from_iter(0..=n);  // the last element will be n
assert_eq!(v, vec![0, 1, 2, 3, 4]);
Run Code Online (Sandbox Code Playgroud)

我们i32可以使用其他数字类型u8,例如u16i8、 等。这是因为 和collect()都是Vec::from_iter泛型方法

所有这些解决方案分别使用RangeRangeInclusive结构,它们都实现Iterator。这使得它们可以轻松地转换为Vec,这通常是通过该collect()方法完成的。