如何从向量创建VecDeque?

Sim*_*han 4 vector rust

我想一个快速创建VecDeque使用::from()。我有以下Rust代码:

use std::collections::VecDeque;

fn main() {
    let ring = VecDeque::from([1, 2, 3]);
    println!("{:?}", ring);
}
Run Code Online (Sandbox Code Playgroud)

我收到以下编译器错误:

use std::collections::VecDeque;

fn main() {
    let ring = VecDeque::from([1, 2, 3]);
    println!("{:?}", ring);
}
Run Code Online (Sandbox Code Playgroud)

看起来该VecDeque集合未实现该from特征,但是文档建议实现该特征 。我究竟做错了什么?

Yuc*_*ong 7

或者,您也可以使用From<Vec<T>>

fn from(other: Vec<T>) -> VecDeque<T>
Run Code Online (Sandbox Code Playgroud)

把一个Vec<T>变成一个VecDeque<T>

这避免了在可能的情况下重新分配,但其条件是严格的,并且可能会发生变化,因此不应依赖,除非Vec<T>来自From<VecDeque<T>>并且尚未重新分配。

例子:

let vector: Vec<i32> = vec![0, 1, 2];
let vec_queue: VecDeque<i32> = VecDeque::from(vector);
Run Code Online (Sandbox Code Playgroud)


Dou*_*oug 5

use std::collections::VecDeque;
use std::iter::FromIterator;
fn main() {
    let ring = VecDeque::from_iter(&[1, 2, 3]);
    println!("{:?}", ring);
}
Run Code Online (Sandbox Code Playgroud)

它仅实现From<Vec<T>>[...]不是Vec。自从它实现以来FromIterator,您可以将任何类型的迭代器用作源from_iter&[1, 2, 3]是因为from_iter需要一个Iterator

  • 这是一个糟糕的答案。它创建一个 `VecDeque&lt;&amp;'static i32&gt;` 而不是 `VecDeque&lt;i32&gt;`。另外,使用“FromIterator”最常用的方法是使用“Iterator::collect”,它不需要“use”。`let Ring: VecDeque&lt;_&gt; = [1, 2, 3].iter().copied().collect();` 将是对问题中代码的更合理的解释。 (5认同)
  • 太好了,谢谢。阅读您的解释后,我发现我也可以执行 `let Ring = VecDeque::from(vec![1, 2, 3]);` 而无需额外的 `use` 语句。这种方法有什么问题吗? (2认同)