【问题标题】:How to initialize a vector with values 0 to n?如何初始化值为 0 到 n 的向量?
【发布时间】:2022-12-19 00:43:04
【问题描述】:

如何在 Rust 中将向量从 0 初始化为 n?除了创建空向量并在循环内调用 push 之外,还有另一种方法吗?

我更喜欢单线。

【问题讨论】:

    标签: vector rust


    【解决方案1】:

    range 可以是 collected 成一个向量:

    pub fn sequence(n: u32) -> Vec<u32> {
        (0..n).collect()
    }
    

    Playground

    【讨论】:

    • 更好(国际海事组织):Vec::from_iter(0..n)
    • 两种解决方案都很好,为我节省了三行代码 :) 我将不得不考虑一下我更喜欢哪一种……
    • 我想你会看到 collect()from_iter() 更常用,因为它可以添加到现有的迭代器链上,但在功能上它们做同样的事情。
    • @kmdreko 实际上是有区别的:collect()需要一个Iterator,而FromIterator::from_iter()需要一个IntoIterator。范围是 Iterators 因此没关系,但是对于数组,例如,它是 [1, 2, 3].into_iter().collect::&lt;Vec&lt;_&gt;&gt;()Vec::from_iter([1, 2, 3]),这是一个更大的差异。
    • @kmdreko 而且由于 FromIterator 是 2021 版以来的前奏,我希望它有更多的用法(我现在使用它更多,而且我也在其他人的代码中看到了)。当您不对可迭代对象执行任何转换时,它会更短,只是转换为另一个容器:Container::from_iter(v) 而不是 v.into_iter().collect::&lt;Container&gt;()
    【解决方案2】:

    这是单行的方法:

    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,我们可以使用其他数字类型,如u8u16i8等。这是因为collect()Vec::from_iter都是generic方法。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多