【发布时间】:2022-12-19 00:43:04
【问题描述】:
如何在 Rust 中将向量从 0 初始化为 n?除了创建空向量并在循环内调用 push 之外,还有另一种方法吗?
我更喜欢单线。
【问题讨论】:
如何在 Rust 中将向量从 0 初始化为 n?除了创建空向量并在循环内调用 push 之外,还有另一种方法吗?
我更喜欢单线。
【问题讨论】:
【讨论】:
Vec::from_iter(0..n)
collect() 比 from_iter() 更常用,因为它可以添加到现有的迭代器链上,但在功能上它们做同样的事情。
collect()需要一个Iterator,而FromIterator::from_iter()需要一个IntoIterator。范围是 Iterators 因此没关系,但是对于数组,例如,它是 [1, 2, 3].into_iter().collect::<Vec<_>>() 与 Vec::from_iter([1, 2, 3]),这是一个更大的差异。
FromIterator 是 2021 版以来的前奏,我希望它有更多的用法(我现在使用它更多,而且我也在其他人的代码中看到了)。当您不对可迭代对象执行任何转换时,它会更短,只是转换为另一个容器:Container::from_iter(v) 而不是 v.into_iter().collect::<Container>()。
这是单行的方法:
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]);
或者,或者:
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]);
除了i32,我们可以使用其他数字类型,如u8、u16、i8等。这是因为collect()和Vec::from_iter都是generic方法。
所有这些解决方案分别使用 Range 或 RangeInclusive 结构,它们都实现了 Iterator。这使它们可以轻松转换为 Vec,这通常是通过 collect() 方法完成的。
【讨论】: