这个问题在这里已经有了答案:
How do I convert a Vec<T> to a Vec<U> without copying the vector?
(2 个回答)
1年前关闭。
我有一个新类型:
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
pub struct Foo(pub u32);
以及它们的向量:let v: Vec<Foo> = Vec::new();
我需要对 v
的只读引用如Vec<u32>
.我怎样才能做到这一点而不会浪费地制作一个新的载体?
反过来呢?
我目前的解决方法涉及创建一个新向量:
foo_vec.iter().map(|x| x.0).collect()
u32_vec.iter().map(|x| Foo(*x)).collect()
我认为编译器不够聪明,无法优化这些内容,即使使用 #[repr(transparent)]
.
最佳答案
如果您无法更改 Foo
的定义, 那么你不能因为不能保证 Foo
与 u32
具有相同的内存表示.
如果可以更改 Foo
的定义, 那么你需要添加 #[repr(transparent)]
对它:
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
#[repr(transparent)]
pub struct Foo(pub u32);
现在您可以使用 std::mem::transmute
在 Foo
之间进行转换和 u32
:let u32_val: u32 = mem::transmute(Foo(42));
let foo_val: Foo = mem::transmute(u32_val);
我不确定这如何转化为 Vec
s,虽然。它可能会起作用,但我认为不能保证(它可能是未定义的行为)。
关于vector - 如何访问新类型的向量作为基础类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63008205/