Rust 切片windows - 一次對數組中多個元素處理
如果想要一次對數組中多個元素處理
例如兩個、三個等等
非常適合用windows
windows就是常聽到的滑動窗口
不只在題目很常看到
在平常Coding也是很好用的方法
windows
文件[1]這樣提到
傳回長度為size的窗口迭代器,並且窗口重疊
...
可能不是很好懂
直接看定義
pub fn windows(&self, size: usize) -> Windows<'_, T>
self為切片本身,可以是字串切片也可以是數組切片
size則是窗口內的要幾個數值
最後回傳一個Windows迭代器
而窗口會重疊
如果傳入大於切片大小的size,不回傳數值
如果size為0,則發生panic
例子
只看文字是不是很難理解
那舉個例子
如果有個數組為[1, 2, 3, 4, 5]
size為2
也就是會輸出[1, 2][2, 3][3, 4][4, 5]
用圖解釋比較好解釋
圖1. 窗口移動講解
以程式碼來說
let data = vec![1, 2, 3, 4, 5];
let res = data.windows(2).collect::<Vec<_>>();
println!("{:?}", res);
[[1, 2], [2, 3], [3, 4], [4, 5]]
第一行創建數組
第二行使用windows創立迭代器,視窗大小設定為2,然後放入數組中
可看出輸出結果與預想一樣
再舉一個
假設size為3
圖2. 窗口大小為3
可看出一開始為[1, 2, 3],第二次會出現[2, 3, 4],第三次為[3, 4, 5]
以程式碼就是這樣
let data = vec![1, 2, 3, 4, 5];
let res = data.windows(3).collect::<Vec<_>>();
println!("{:?}", res);
[[1, 2, 3], [2, 3, 4], [3, 4, 5]]
而如果size大於data的數量會發生什麼事?
let data = vec![1, 2, 3, 4, 5];
let res = data.windows(6).collect::<Vec<_>>();
println!("{:?}", res);
[]
會直接輸出空數組
另一個是size為0會發生什麼事?
let data = vec![1, 2, 3, 4, 5];
let res = data.windows(0).collect::<Vec<_>>();
println!("{:?}", res);
thread 'main' panicked at 'window size must be non-zero', src\main.rs:11:20
這次會直接panic,明確顯示window size不能為0
應用
舉一個簡單的應用
原本記得在LeetCode上面有做到蠻有趣的題目
但突然找不到
用一個windows搭配map[2]先頂著
假設一樣剛剛的數組
希望獲得每兩個數值的平方相加
可以這麼做
let data = vec![1, 2, 3, 4, 5];
let res = data
.windows(2)
.map(|x| x[0] * x[0] + x[1] * x[1])
.collect::<Vec<_>>();
println!("{:?}", res);
[5, 13, 25, 41]
windows會取出兩個數值
透過map以及閉包配合
可以獲得每兩個數值平方相加結果
參考資料
[1] https://doc.rust-lang.org/std/primitive.slice.html#method.windows
0 comments:
張貼留言