【问题标题】:What is the idiomatic way to get the tail of a vector?获取向量尾部的惯用方法是什么?
【发布时间】:2020-05-16 04:55:47
【问题描述】:

我有这个:

let stuff = vec![1, 2, 3];
let tail = stuff[1..].iter().collect::<Vec<_>>();
println!("Hello, world! {:?}", tail);

我想知道这是否是惯用的,因为我发现对iter 的调用,然后是对collect 的详细调用。

【问题讨论】:

  • “stuff[1..]”有什么问题?!?你的问题很不清楚
  • @Stargateur 问题不在于“stuff[1..]”,而是首先必须这样做,然后调用 iter 然后收集。我原以为 Vec 上会有一种方法可以获取尾部……例如 stuff.tail() 或 stuff.take(1,2)
  • 在提供的代码中,您正在将引用向量创建到原始向量中。这真的是你想要的吗?它非常小众,所以我不希望有专门的方法。
  • @sca 这最初是让我无法理解的,但您的评价是is correct。有了这个,我想不出你想要这个的理由。它具有与切片引用相同的生命周期约束,但具有额外的堆分配。

标签: rust


【解决方案1】:

您不需要实际创建一个新向量来打印这些值。只用一片。

let tail = &stuff[1..];
println!("Hello, world! {:?}", tail);

playground

【讨论】:

  • 假设您已经创建了一个需要使用的向量
  • @Finlay 在这个例子中stuff 可能是一个向量。关键是您不需要创建第二个。
  • @trentcl 但对向量执行 &stuff[1..] 的行为会将其变成切片!如果您仍然想使用 Vector 进行操作怎么办?
  • @Finlay 什么的向量?您在问题中提供的代码收集了一个引用向量,这在大多数方面都比仅仅取一个切片有用。如果你想要一个克隆整数的向量,你可以使用to_vec,正如我在my answer to another question中提到的那样。
  • @Finlay Vec&lt;T&gt; 不是递归定义的,比如“一个向量要么是空的,要么是一个 T 后跟一个 Vec&lt;T&gt;”(你可能已经在其他语言中看到过这样定义的列表)。相反,它被定义为a contiguous growable array type。链表的“尾”是另一个链表,但向量的“尾”只是向量的一部分——它本身不是向量,因为它不拥有自己的内容并且不可增长。我们可以将连续的“向量的一部分”称为slice,你可以用它来做有用的事情,不管有没有......
【解决方案2】:

由于切片(以及因此Vec)实现DoubleEndedIterator,您可以采用迭代器(1,2,3,4),反转它(4,3,2,1),采用多个元素(4,3,2)并再次反转它.起初这可能看起来很奇怪,但不需要进行手动切片,也不需要考虑特殊情况:

fn main() {
    let v = vec![1,2,3,4,5];

    // Will print the last 3 elements in order; "3,4,5"
    for x in v.iter().rev().take(3).rev() {
        println!("{}", x);
    }
}

【讨论】:

  • 这是一个巧妙的技巧,但在 OP 的情况下似乎没有必要,因为它们从迭代器的开头跳过了一个集合号,而不是从末尾获取一个集合号。
【解决方案3】:

您可能想要使用[T]::split_first,它返回一个Option,而不是恐慌。这意味着您可以选择在stuff 为空时执行的操作。

if let Some((_, tail)) = stuff.split_first() {
    println!("Hello, world! {:?}", tail);
}

let (_, tail) = stuff.split_first().unwrap() 等同于 let tail = &amp;stuff[1..](但恐慌消息略有不同)。

另见

【讨论】:

    猜你喜欢
    • 2011-05-04
    • 2022-01-15
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    相关资源
    最近更新 更多