繁体   English   中英

不同大小的元组向量

[英]Vector of tuples with different size

我目前正在使用 Rust 实施行进立方体算法,我遇到了一个问题。 该算法需要使用我从GitHub复制的三角表。但是Rust中的哪个数据结构允许我们存储这样的数据?

这些元组意味着立方体的哪些边必须连接,所以它们的大小都不同。

pub fn tri_table()-> Vec<???>
{
   return vec![
      (),
      (0, 8, 3),
      (0, 1, 9),
      (1, 8, 3, 9, 8, 1),
      (1, 2, 10),
      (0, 8, 3, 1, 2, 10),
      (9, 2, 10, 0, 2, 9),
      (2, 8, 3, 2, 10, 8, 10, 9, 8),
      (3, 11, 2),
      (0, 11, 2, 8, 11, 0),
      (1, 9, 0, 2, 3, 11),
      (1, 11, 2, 1, 9, 11, 9, 8, 11),
      (3, 10, 1, 11, 10, 3),
      (0, 10, 1, 0, 8, 10, 8, 11, 10),
      (3, 9, 0, 3, 11, 9, 11, 10, 9),
      (9, 8, 10, 10, 8, 11),
      (4, 7, 8),
      ...
   ];
}

听起来你的三角测量表在编译时是已知的。 在这种情况下,使用 static 个切片。 这是成本最低的解决方案,它的开销几乎为零。 对于以后不能再修改的价格。

像这样:

pub fn tri_table() -> &'static [&'static [i32]] {
    &[
        &[],
        &[0, 8, 3],
        &[0, 1, 9],
        &[1, 8, 3, 9, 8, 1],
        &[1, 2, 10],
        &[0, 8, 3, 1, 2, 10],
        &[9, 2, 10, 0, 2, 9],
        &[2, 8, 3, 2, 10, 8, 10, 9, 8],
        &[3, 11, 2],
        // ...
    ]
}

通过这样做,数据将直接烘焙到可执行文件的数据段中,调用tri_table()仅返回指向它的指针,不会发生分配,也不会使用堆 memory。 多次调用tri_table()将始终返回对同一地址的引用,因此如果多次调用它也不会产生开销。

Finomnis 已经为您的问题提出了一个有效的解决方案。 但是对于那些通过搜索将不同元组放入一个向量中的方法而发现这个问题的人来说,该向量中元组的数量和类型在编译时可能是未知的。 向量通常就是这种情况。

因此,如果您确实需要向量,Rust 中的两种主要方法是使用特征对象向量或具有值的枚举向量。 这两种方法各有利弊。 枚举可能会使用更多的 memory(取决于具有最大值的枚举变体的大小),但是特征 object 需要一个额外的(胖)指针(如此处解释)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM