#mapped #order #data #vec #vector #store #indices

mapped_vec

一个库,不仅可以存储数据,还可以存储其顺序

1个不稳定版本

0.1.1 2020年8月30日
0.1.0 2020年8月30日

#7 in #mapped

MIT 许可证

13KB
245

这个库旨在提供一个接口,用于存储数据及其顺序的向量。这种类型的向量称为映射向量。映射向量适用于对大型类型进行快速处理,因为在大型类型的情况下,移动几个指定数据顺序的数字比移动实际数据要快。映射向量的反转和旋转函数都是O(1),因为反转函数只是将函数转换为过滤索引的函数,旋转函数只需要编辑每个索引的数字偏移量,并可能交换几个函数。插入和删除通常也更快,即使是对于小型类型。映射向量还支持转换为普通向量,尽管这可能会很昂贵,因此建议使用get_mapped方法来获取一个按顺序引用元素的向量。这适用于no_std with alloc。

使用随机数和计时函数的示例用法

use mapped_vec::MappedVec;

use rand::prelude::*;

fn main() {

let mut rng = rand::thread_rng();

let mut rgen = (0..100_000).map(|_| rng.gen::()).collect::<Vec>();

let mut mapped = MappedVec::new();

mapped.extend_from_slice(&rgen);

let ind = rng.gen::() as usize;

let timed = std::time::Instant::now();

mapped.remove(ind);

println!("Remove of mapped vector: {:?}", timed.elapsed());

let timed = std::time::Instant::now();

rgen.remove(ind);

println!("Remove of regular vector: {:?}", timed.elapsed());

let timed = std::time::Instant::now();

mapped.insert(ind, 0.0);

println!("Insert of mapped vector: {:?}", timed.elapsed());

let timed = std::time::Instant::now();

rgen.insert(ind, 0.0);

println!("Insert of regular vector: {:?}", timed.elapsed());

let timed = std::time::Instant::now();

mapped.reverse();

println!("Time to reverse mapped vector: {:?}", timed.elapsed());

let timed = std::time::Instant::now();

rgen.reverse();

println!("Time to reverse regular vector: {:?}", timed.elapsed());

let timed = std::time::Instant::now();

let rvec = mapped.to_vec();

println!("Time to convert mapped vector to real vector: {:?}", timed.elapsed());

assert_eq!(rvec, rgen);

}

没有运行时依赖