gpt4 book ai didi

vector - 如何访问新类型的向量作为基础类型

转载 作者:行者123 更新时间:2023-12-03 11:35:23 35 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





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 的定义, 那么你不能因为不能保证 Foou32 具有相同的内存表示.
如果可以更改 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/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com