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

标签 vector rust casting

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





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/

相关文章:

rust - 在函数的输出或变量上使用 as_str 有什么区别?

rust - 创建引用自身的新值时,如何修复错误 `self` 生命周期不够长?

rust - 为什么在 Rust/Wasm 初学者书籍的第 4.2 节中,从 JavaScript 传递到 Wasm 的字符串总是空的?

java - 无法从 object 转换为int

c++ - 分配的内存在栈或堆中

c++ - 为什么在分配/取消分配一些小对象后内存不可重用?

C++ 释放自定义类 vector 的正确方法

c++ - 重载 boolean/字符串歧义

c++ - 当这些对象具有相同的二进制表示时,将两个不相关的对象 vector `reinterpret_cast` 是否安全?

c++ - 计算 vector vector 子集的最佳方法