簡體   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