2017-04-21 16 views
6

Trong Rust, làm thế nào để tránh viết các vòng này? Mã này lấy một vector và nhân ba yếu tố liền kề với một sản phẩm. Do đó, vòng lặp bên ngoài đi qua tất cả các phần tử có thể tạo thành một nhóm ba và vòng lặp bên trong thực hiện phép nhân.Làm thế nào để tránh các vòng lặp khi lặp qua các phần tử lân cận của một vector

Khó khăn nằm, tôi nghĩ, trong vòng lặp không đầy đủ của vòng lặp ngoài (từ phần tử 0 đến last - 3). Hơn nữa, vòng lặp bên trong phải sử dụng một phạm vi phụ.

Có cách nào để tránh viết các vòng lặp không?

let v = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9]; 
let mut products = Vec::new(); 
for seq in 0..v.len() - 3 { 
    let mut product = 1; 
    for offset in 0..3 { 
     product *= v[seq + offset]; 
    } 
    products.push(product); 
} 
+0

Ngay bây giờ, tất cả các tính 'product's được bỏ đi và không có gì thực sự xảy ra. Bạn có muốn thu thập tất cả các sản phẩm đó thành một véc tơ hay bạn muốn làm gì với chúng? –

+0

Bạn nói đúng. Điều đó đã bị mất trong khi cắt mã gốc của tôi thành ví dụ trên. Tôi đã chỉnh sửa. – dani

Trả lời

8

Chức năng bạn đang tìm kiếm là [T]::windows(). Bạn có thể chỉ định kích thước của các cửa sổ chồng chéo và nó sẽ trả về một trình lặp trên các lát phụ.

Bạn có thể lấy sản phẩm của tất cả các phần tử trong một phần con bằng cách tạo một trình vòng lặp ra khỏi nó và sử dụng Iterator::product().

let v = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9]; 
let products: Vec<u64> = v.windows(3) 
    .map(|win| win.iter().product()) 
    .collect(); 

(Playground)

Dưới đây chúng tôi thu thập tất cả các sản phẩm vào một vector mới.


Một lưu ý cuối cùng: thay vì viết xuống tất cả các số trong vector bằng tay bạn có thể viết này để thay thế:

let v: Vec<_> = (1..10).chain(1..10).collect(); 
Các vấn đề liên quan