[英]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示例如下。
下面,該函數返回一個數組數組。 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
}
第二個示例顯示了返回原始數據引用數組的函數。 這不需要約束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.