#array #array-vec #vec #stack #vector #no-std

nightly no-std staticvec

使用 const generics 实现了一个基于数组的固定容量栈分配 Vec 替代方案。

74 个版本

0.11.9 2022 年 9 月 30 日
0.11.7 2022 年 7 月 24 日
0.11.4 2022 年 3 月 24 日
0.11.0 2021 年 12 月 24 日
0.1.6 2019 年 7 月 31 日

#1736数据结构

50 每月下载量
7 包中使用(直接使用 4 个)

MIT/Apache

295KB
5K SLoC

Latest Version Rustc Version nightly

Build status docs.rs

实现了一个基于数组的固定容量 Vec 替代方案,使用 const generics。

注意:这里的“static”是指传统意义上的“不变的”或“非动态”。

此包不使用字面量 static 变量用于任何东西(但提供多种方法来实例化 StaticVec 作为 staticconst 变量,如果需要的话)。

通过在您的 Cargo.toml 中将 staticvec 依赖项的 default-features = false 设置为 false,与 no_std 兼容(几乎无功能损失)。

通过激活 serde 包的特性,可选地支持 StaticVec 结构体的序列化和反序列化。

StaticVec 还实现了 DerefDerefMut[T],这意味着可以通过它的实例访问所有现有的切片方法,并且可以在期望 [T] 的上下文中使用对其的引用。

截至版本 0.8.0,此包还提供了一个固定容量的 StaticString 结构体,它基于 StaticVec<u8, N> 的一个实例构建。

截至版本0.8.5,基于标准库BinaryHeap和围绕一个StaticVec<T, N>实例构建的固定容量StaticHeap结构体也已添加。

欢迎贡献/建议等!

最低支持的Rust版本:由于使用了提供功能超出稳定最小子集(如min_const_genericsmin_const_fn)范围的各个功能门,目前这是一个仅限nightly的crate。

基本使用示例

use staticvec::{staticvec, StaticVec};

fn main() {
  let mut v = StaticVec::<usize, 64>::new();
  for i in 0..v.capacity() {
    v.push(i);
  }
  for i in &v {
    println!("{}", i);
  }
  v.clear();
  v.insert(0, 47);
  v.insert(1, 48);
  v.insert(2, 49);
  v.insert(v.len() - 1, 50);
  v.insert(v.len() - 2, 51);
  v.insert(v.len() - 3, 52);
  for i in &v {
    println!("{}", i);
  }
  for i in &v.reversed().drain(2..4) {
    println!("{}", i);
  }
  while v.is_not_empty() {
    println!("{}", v.remove(0));
  }
  for f in staticvec![12.0, 14.0, 15.0, 16.0].iter().skip(2) {
    println!("{}", f);
  }
  for i in staticvec![
    staticvec![14, 12, 10].sorted(),
    staticvec![20, 18, 16].reversed(),
    staticvec![26, 24, 22].sorted(),
    staticvec![32, 30, 28].reversed(),
  ]
  .iter()
  .flatten()
  .collect::<StaticVec<usize, 12>>()
  .iter() {
    println!("{}", i);
  }
  // The type parameter is inferred as `StaticVec<usize, 16>`.
  let filled = StaticVec::<_, 6>::filled_with_by_index(|i| {
    staticvec![
      i + 1,
      i + 2,
      i + 3,
      i + 4,
    ]
    .concat(&staticvec![6, 6, 7, 7])
    .intersperse((i + 4) * 4)
  });
  println!("{:?}", filled);
}

许可证

许可协议为MIT许可证Apache许可证的2.0版本。您可以选择其中之一!任何源代码贡献将以相同的方式双许可。

依赖项

~0–265KB