2015-09-10 25 views
0

我的最終目標是洗牌矩陣的行(爲此我使用納爾代數)。如何在Vec或切片中設置範圍?

爲了解決這個問題,我需要設置一個數組的可變範圍(slice)。 假設我有一個數組這樣(讓我們說這是一個3×3矩陣):

let mut scores = [7, 8, 9, 10, 11, 12, 13, 14, 15]; 

我已經提取的行這樣的:

let r = &scores[..].chunks(3).collect::<Vec<_>>()[1]; 

現在,對於克努特洗牌我需要交換此與另一排。我需要做的是:

scores.chunks_mut(3)[0] = r; 

然而,這未能按這樣的:

cannot index a value of type `core::slice::ChunksMut<'_, _>` 

例子:http://is.gd/ULkN6j

+0

請創建一個[MCVE](/幫助/ MCVE)遊樂場(https://play.rust-lang.org/)。例如,這[工作得很好](http://is.gd/0GYnam)。 – Shepmaster

+0

嗯,工作,因爲你只是添加到一個元素..我想設置一個範圍,如標題中所述。 http://is.gd/ULkN6j – bge0

+0

可能的重複http://stackoverflow.com/questions/28219231/how-to-idiomatically-copy-a-slice或http://stackoverflow.com/questions/25225346/how不同尺寸的數組之間的數組之間的拷貝 – Shepmaster

回答

0

最後我在做一個循環,這似乎是一個更清潔的實施對我的元素交換的元素:在[鏽病編譯

fn swap_row<T>(matrix: &mut [T], row_src: usize, row_dest: usize, cols: usize){ 
     for c in 0..cols { 
     matrix.swap(cols * row_src + c, cols * row_dest + c); 
     } 
    } 
0

您的代碼,只要你願意把它寫,不能正常工作。你有一個數組,你正在嘗試讀取和寫入同時。這會導致你有重複的數據:

[1, 2, 3, 4] 
// Copy last two to first two 
[3, 4, 3, 4] 
// Copy first two to last two 
[3, 4, 3, 4] 

Rust會阻止你對同一事物的可變和不可變引用,因爲這個原因。

不能索引類型core::slice::ChunksMut<'_, _>

chunks_mut的值返回迭代器。 只有迭代器保證做的事情是返回「下一件事」。你不能索引它,它不是全部在連續內存中可用。

要移動東西,您將需要臨時存儲數據的地方。一種方法是數組複製:

let scores = [7, 8, 9, 10, 11, 12, 13, 14, 15]; 
let mut new_scores = scores; 

for (old, new) in scores[0..3].iter().zip(new_scores[6..9].iter_mut()) { 
    *new = *old; 
} 

for (old, new) in scores[3..6].iter().zip(new_scores[0..3].iter_mut()) { 
    *new = *old; 
} 

for (old, new) in scores[6..9].iter().zip(new_scores[3..6].iter_mut()) { 
    *new = *old; 
} 

然後,它的下面這些existing questionsone從一個到另一個複製的問題。

+0

不,我理解複製和交換.....雖然這個例子是人爲設計的。我將存儲我收集的塊,然後將其替換爲其他內容,而不是如何編寫示例,所以它不會被重複元素。我可以不收集chunk_mut來完整替換它嗎?如果沒有完整的副本,是否無法在內部移動數據?看起來有點過分,以致移動操作的內存消耗加倍。 – bge0