如何从一个向量创建一个VecDeque?

17

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

use std::collections::VecDeque;

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

我遇到了以下编译器错误:

error[E0277]: the trait bound `std::collections::VecDeque<_>: std::convert::From<[{integer}; 3]>` is not satisfied
 --> src/main.rs:4:16
  |
4 |     let ring = VecDeque::from([1, 2, 3]);
  |                ^^^^^^^^^^^^^^ the trait `std::convert::From<[{integer}; 3]>` is not implemented for `std::collections::VecDeque<_>`
  |
  = help: the following implementations were found:
            <std::collections::VecDeque<T> as std::convert::From<std::vec::Vec<T>>>
  = note: required by `std::convert::From::from`

这看起来像是VecDeque集合没有实现from trait,但文档表明它是有的。我做错了什么?

2个回答

16

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

fn from(other: Vec<T>) -> VecDeque<T>

将一个 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);

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

它只实现了 From<Vec<T>>[...] 不是一个 Vec。由于它实现了 FromIterator,你可以使用任何类型的迭代器作为源来使用 from_iter&[1, 2, 3] 是因为 from_iter 接受一个 Iterator


2
太好了,谢谢。在阅读了您的解释之后,我发现我也可以做 let ring = VecDeque::from(vec![1, 2, 3]); 而不需要额外的 use 语句。这种方法有什么问题吗? - Simon Brahan
@SimonBrahan 不完全是这样 - 它将比 from_iter 方法执行更多的堆分配,但这不太相关。但是,为什么要避免额外的 use 语句呢?它不会以任何方式造成伤害。 - Sven Marnach
@SimonBrahan 不是的;从技术上讲,它们是不同的,但实际上 Vec 在所有 Rust 代码中普遍使用。选择哪个对你来说更符合人体工程学就好了。 - Doug
但这只能工作是因为整数是“可复制的”,对吗? - Jonah
7
这是一个糟糕的答案。它创建了一个VecDeque<&'static i32>而不是VecDeque<i32>。另外,使用FromIterator最常见的方式是使用Iterator::collect,这不需要被uselet ring: VecDeque<_> = [1, 2, 3].iter().copied().collect();更合理地解释了问题中的代码。 - trent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接