二維數(shù)組
在Rust編程語(yǔ)言中,二維數(shù)組可以用來(lái)表示一個(gè)矩陣或者是一個(gè)表格結(jié)構(gòu),它是由多個(gè)一維數(shù)組組成的數(shù)組。在Rust中,通常使用Vec<Vec<T>>來(lái)表示二維數(shù)組,其中T是數(shù)組中元素的類(lèi)型。
聲明和初始化二維數(shù)組
在Rust中,你可以使用vec!宏來(lái)聲明和初始化二維數(shù)組。例如,創(chuàng)建一個(gè)3行4列的二維數(shù)組,每個(gè)元素都是i32類(lèi)型的0,可以這樣做:
let mut matrix = vec![vec![0; 4]; 3];
這里,vec![0; 4];創(chuàng)建了一個(gè)包含4個(gè)0的一維數(shù)組,然后vec![vec![0; 4]; 3];使用這個(gè)一維數(shù)組創(chuàng)建了3個(gè)副本,形成了一個(gè)3行4列的二維數(shù)組。
訪(fǎng)問(wèn)二維數(shù)組的元素
你可以使用兩個(gè)索引來(lái)訪(fǎng)問(wèn)二維數(shù)組中的元素,第一個(gè)索引表示行,第二個(gè)索引表示列。例如,要訪(fǎng)問(wèn)上面創(chuàng)建的matrix中的第一個(gè)元素(第0行,第0列):
let first_element = matrix[0][0];
修改二維數(shù)組的元素
由于matrix被聲明為可變的(mut關(guān)鍵字),你可以修改其元素。例如,將第一個(gè)元素設(shè)置為1:
matrix[0][0] = 1;
遍歷二維數(shù)組
遍歷二維數(shù)組通常需要使用嵌套的for循環(huán)。例如,打印出所有元素:
for row in matrix.iter() {
for element in row.iter() {
print!("{} ", element);
}
println!();
}
二維數(shù)組的性能考量
-
內(nèi)存布局:Rust中的
Vec<Vec<T>>并不保證所有行都有相同的大小,這與C語(yǔ)言中的傳統(tǒng)二維數(shù)組不同。Rust的這種設(shè)計(jì)提供了更高的靈活性,但也可能導(dǎo)致內(nèi)存布局不如傳統(tǒng)二維數(shù)組緊湊。 -
性能:由于
Vec<Vec<T>>是一種嵌套的動(dòng)態(tài)數(shù)組,它的性能特性與單獨(dú)的Vec<T>相似。這意味著在數(shù)組大小變化時(shí),可能會(huì)有動(dòng)態(tài)的內(nèi)存分配和釋放。 -
安全性:Rust的類(lèi)型系統(tǒng)和所有權(quán)規(guī)則確保了二維數(shù)組操作的安全性。例如,編譯器會(huì)檢查數(shù)組索引是否越界。
使用二維數(shù)組時(shí),需要根據(jù)實(shí)際的應(yīng)用場(chǎng)景來(lái)權(quán)衡這些因素,以選擇最合適的數(shù)據(jù)結(jié)構(gòu)。
普通數(shù)組組成的二維數(shù)組
在Rust中,除了使用Vec<Vec<T>>來(lái)創(chuàng)建動(dòng)態(tài)的二維數(shù)組之外,你還可以使用普通數(shù)組([T; N])來(lái)創(chuàng)建固定大小的二維數(shù)組。這種數(shù)組在內(nèi)存中是連續(xù)存儲(chǔ)的,非常適合需要快速訪(fǎng)問(wèn)和迭代的情況。
聲明和初始化二維數(shù)組
要聲明一個(gè)固定大小的二維數(shù)組,你需要指定每一行的大小和列的大小。例如,創(chuàng)建一個(gè)3行4列的二維數(shù)組,可以這樣做:
let mut matrix: [[i32; 4]; 3] = [[0; 4]; 3];
這里,[0; 4]創(chuàng)建了一個(gè)包含4個(gè)0的一維數(shù)組,然后[[0; 4]; 3]使用這個(gè)一維數(shù)組創(chuàng)建了3個(gè)副本,形成了一個(gè)3行4列的二維數(shù)組。
訪(fǎng)問(wèn)二維數(shù)組的元素
你可以使用兩個(gè)索引來(lái)訪(fǎng)問(wèn)二維數(shù)組中的元素,第一個(gè)索引表示行,第二個(gè)索引表示列。例如,要訪(fǎng)問(wèn)上面創(chuàng)建的matrix中的第一個(gè)元素(第0行,第0列):
let first_element = matrix[0][0];
修改二維數(shù)組的元素
由于matrix被聲明為可變的(mut關(guān)鍵字),你可以修改其元素。例如,將第一個(gè)元素設(shè)置為1:
matrix[0][0] = 1;
遍歷二維數(shù)組
遍歷固定大小的二維數(shù)組通常使用嵌套的for循環(huán)。例如,打印出所有元素:
for row in &matrix {
for &element in row {
print!("{} ", element);
}
println!();
}
性能考量
- 內(nèi)存布局:固定大小的二維數(shù)組在內(nèi)存中是連續(xù)存儲(chǔ)的,這意味著它們?cè)谠L(fǎng)問(wèn)時(shí)可以享受到更好的緩存局部性,這對(duì)于性能是有益的。
-
大小固定:與
Vec<Vec<T>>不同,固定大小的二維數(shù)組在編譯時(shí)大小是固定的,這意味著你不能在運(yùn)行時(shí)改變它們的大小。
示例
下面是一個(gè)完整的示例,展示了如何創(chuàng)建和操作固定大小的二維數(shù)組:
fn main() {
let mut matrix: [[i32; 4]; 3] = [[0; 4]; 3];
// 修改元素
matrix[0][0] = 1;
// 訪(fǎng)問(wèn)元素
println!("First element: {}", matrix[0][0]);
// 遍歷數(shù)組
for row in &matrix {
for &element in row {
print!("{} ", element);
}
println!();
}
}
這個(gè)示例創(chuàng)建了一個(gè)3行4列的二維數(shù)組,修改了第一個(gè)元素,然后遍歷并打印出了所有元素。
練習(xí)題1:對(duì)角線(xiàn)和
創(chuàng)建一個(gè)函數(shù),該函數(shù)接受一個(gè)整數(shù)n和一個(gè)二維數(shù)組matrix作為參數(shù)。這個(gè)二維數(shù)組應(yīng)該是n x n大小的,并且函數(shù)需要計(jì)算并返回這個(gè)二維數(shù)組對(duì)角線(xiàn)(從左上角到右下角)上所有元素的和。
fn diagonal_sum(n: usize, matrix: [[i32; n]; n]) -> i32 {
// 你的代碼
}
練習(xí)題2:幻方
創(chuàng)建一個(gè)函數(shù),該函數(shù)接受一個(gè)整數(shù)n和一個(gè)二維數(shù)組matrix作為參數(shù)。這個(gè)二維數(shù)組應(yīng)該是n x n大小的,并且函數(shù)需要檢查這個(gè)二維數(shù)組是否是一個(gè)幻方。幻方是一種n x n的矩陣,其每行、每列以及兩條對(duì)角線(xiàn)的和都相等。
fn is_magic_square(n: usize, matrix: [[i32; n]; n]) -> bool {
}
fn main() {
let matrix = [
[2, 7, 6],
[9, 5, 1],
[4, 3, 8],
];
let n = matrix.len();
println!("Is magic square: {}", is_magic_square(n, matrix));
}