#map #vec #filter-map

map_in_place

在映射元素时,如果可能的话,重用Vec、Box<[T]>或Box的内存

1 个不稳定版本

使用旧的Rust 2015

0.1.0 2016年8月18日

#687内存管理

Download history 1/week @ 2023-11-20 3/week @ 2023-11-27 2/week @ 2024-01-08 7/week @ 2024-02-12 12/week @ 2024-02-19 30/week @ 2024-02-26 20/week @ 2024-03-04

69 每月下载量
3 个crate中使用(通过prefixopt

Apache-2.0 / MIT

12KB
222

map_in_place

在映射Vec、Box<[T]>或Box的元素时,如果可能,重用分配。

为了原地映射,类型必须具有相同的对齐方式,

  • 对于boxed slices,大小必须相等,
  • 对于向量,out的大小必须是in类型的倍数。(因此out不能大于in)

如果不可能,..._in_place() 方法将panic,而其他方法将回退到迭代和收集。

示例

extern crate map_in_place;
use map_in_place::MapVecInPlace;
fn main() {
    let v = vec![8_u32,29,14,5];
    let v = v.filter_map(|n| if n < 10 {Some( (n as u8+b'0') as char)}
                             else      {None}
                        );// happens in place
    assert_eq!(&v, &['8','5']);
    let v = v.map(|c| c as u8);// falls back to iterators
    assert_eq!(&v[..], &b"85"[..]);
}

为什么有这么多限制?

Rust分配接口比标准的C接口更复杂,后者是malloc(size_t)free(void*)

首先,malloc和free接受您想要存储的类型对齐方式,使用一种对齐方式分配并使用另一种对齐方式释放是未定义的行为。

其次,Rust要求所有者知道要释放的内存大小,这意味着类型之一的大小必须是另一个的倍数,因为容量是整数。

许可协议

根据您的选择,许可协议如下

贡献

除非您明确声明,否则根据Apache-2.0许可协议定义,您提交的任何有意包含在作品中的贡献,都将按照上述方式双重许可,不附加任何额外条款或条件。

依赖项

~22KB