簡體   English   中英

將數組切片轉換為切片數組

[英]Converting a slice of arrays into an array of slices

我有一片固定大小的數組( &[[T; N]] ),我希望能夠將其視為一個切片數組( [&[T]; N] )。 輸出數組的第i個元素將是原始切片中每個數組中所有第i個項目的切片:

fn magic_operation<T, const N: usize>(input: &[[T; N]]) -> [&[T]; N] {
    todo!()
}

let original = &[
    [10, 11, 12],
    [20, 21, 22],
    [30, 31, 32],
    [40, 41, 42],
    [50, 51, 52],
];

let new_view = magic_operation(original);

assert_eq!(new_view, [
    &[10, 20, 30, 40, 50],
    &[11, 21, 31, 41, 51],
    &[12, 22, 32, 42, 52],
]);

我不知道這是否在任何 stdlib 方法中公開,而且我對不安全的 Rust 了解不夠,無法自己嘗試解決這個問題。 這是否可以實現,也許是使用具有不同內存步幅的切片?

這不可能。

切片中的 Rust 元素是連續的; 沒有多余的空格。 為了返回&[10, 20, 30, 40, 50] ,那么該元素序列必須存在於其他地方以引用它們。 該序列在原始輸入中不存在。

數組切片到切片數組

如果我們談論的是安全代碼,那么這是不可能的。 使用不安全的代碼,您可以返回一個切片數組,但嚴格來說它不是數據的“視圖”,我們必須通過復制值或引用來構造數據。 這種不安全的編碼不太可能是您需要或想要的。


Rust Playground示例如下。

M x N 數組切片到 N x M 數組數組

下面,該函數返回一個數組數組。 T上的約束是使用T::default()作為初始T::default()所必需的。 將 M x N 數組切片轉換為 N x M 數組數組。

fn magic_operation<T, const N: usize, 
                      const M: usize>(input: &[[T; N]; M]) -> [[T; M]; N] 
where T: Default + Copy,
{
    let mut v = [[T::default(); M]; N];
    
    for i in 0..M {
        for j in 0..N {
            v[j][i] = input[i][j];
        }
    }
    v
}

M x N 數組切片到 N x M 數組的原始數據引用數組

第二個示例顯示了返回原始數據引用數組的函數。 這不需要約束T因為它使用input中第一個值的引用來初始化新數組 - 如果我們願意,我們也可以在第一個示例中這樣做,這將消除T上的Default約束。

fn magic_operation2<T, const N: usize, 
                       const M: usize>(input: &[[T; N]; M]) -> [[&T; M]; N] 
{
    let mut v = [[&input[0][0]; M]; N];
    
    for i in 0..M {
        for j in 0..N {
            v[j][i] = &input[i][j];
        }
    }
    v
}

還有一些 crate 可以靈活地創建新數組, array_init就是其中之一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM