[b7f8cadb] | 1 | use std::convert::TryInto;
|
---|
| 2 | use std::convert::TryFrom;
|
---|
| 3 | fn main() {
|
---|
| 4 | // typed/size/repeat initialization
|
---|
| 5 | let val = 42;
|
---|
| 6 | let mut ia: [usize; 5] = [val; 5];
|
---|
| 7 |
|
---|
| 8 | // typed/size/individual initialization
|
---|
| 9 | let fval = 42.2;
|
---|
| 10 | let fa: [f64; 5] = [1.2, fval, 5.6, 7.3, 9.1];
|
---|
| 11 |
|
---|
| 12 | // enumerating range/type
|
---|
| 13 | for i in 0..ia.len() { print!("{:?} ", ia[i] ); } println!(""); // 42 42 42
|
---|
| 14 | for fv in fa { print!("{:?} ", fv ); } println!(""); // 1.2 42.2 5.6
|
---|
| 15 | for i in 0..=1 { ia[i] = i; } // mutable changes
|
---|
| 16 | for iv in ia { print!("{:?} ", iv ); } println!(""); // 0 1 42
|
---|
| 17 |
|
---|
| 18 | // 2 dimensional (matrix), fixed-size
|
---|
| 19 | const ROWS: usize = 4;
|
---|
| 20 | const COLS: usize = 6;
|
---|
| 21 | let mut fmatrix: [[f64; COLS]; ROWS] = [[0.; COLS]; ROWS];
|
---|
| 22 | for r in 0 .. ROWS {
|
---|
| 23 | for c in 0 .. COLS {
|
---|
| 24 | fmatrix[r][c] = r as f64 + c as f64;
|
---|
| 25 | }
|
---|
| 26 | println!( "{:?}", fmatrix[r] );
|
---|
| 27 | }
|
---|
| 28 |
|
---|
| 29 | let mut slice2: &[f64] = &fmatrix[3][2 ..= 4];
|
---|
| 30 | println!( "{:?}", slice2 );
|
---|
| 31 | slice2 = &fmatrix[1 ..= 3][1];
|
---|
| 32 | println!( "{:?}", slice2 );
|
---|
| 33 |
|
---|
| 34 | // implicit type/size, print entire array and length
|
---|
| 35 | println!( "{:?} {:?}", ia, ia.len() );
|
---|
| 36 | ia = [5; 5];
|
---|
| 37 | println!( "{:?} {:?}", ia, ia.len() );
|
---|
| 38 | ia = [1, 2, 3, 4, 5];
|
---|
| 39 | println!( "{:?} {:?}", ia, ia.len() );
|
---|
| 40 |
|
---|
| 41 | // array copy
|
---|
| 42 | let ia2: [usize; 5];
|
---|
| 43 | ia2 = ia;
|
---|
| 44 | println!( "copy = {:?} ", ia2 ); // 0 1 42
|
---|
| 45 |
|
---|
| 46 | let mut numbers = [1, 2, 3, 4, 5];
|
---|
| 47 | // pass array by value
|
---|
| 48 | fn update1( mut arr:[i32; 5] ) {
|
---|
| 49 | for i in 0 .. arr.len() { arr[i] = 0; }
|
---|
| 50 | println!( "function update {:?}", arr );
|
---|
| 51 | }
|
---|
| 52 | update1( numbers );
|
---|
| 53 |
|
---|
| 54 | // pass array by reference
|
---|
| 55 | fn update2( arr: & mut [i32; 5] ) {
|
---|
| 56 | for i in 0 .. arr.len() { arr[i] = 0; }
|
---|
| 57 | println!( "function update {:?}", arr );
|
---|
| 58 | }
|
---|
| 59 | update2( &mut numbers );
|
---|
| 60 |
|
---|
| 61 | // slice is barrowing a subset of an array, dimension bounds can be expressions
|
---|
| 62 | println!( "slice {:?}", &ia[0..3] ); // fixed bounds, [1, 2, 3]
|
---|
| 63 | println!( "slice {:?}", &ia[ia.len() - 2 .. ia.len()] ); // variable bounds, [4, 5]
|
---|
| 64 | println!( "slice {:?}", &ia[ia.len() - 2 .. ] ); // drop upper bound, [4, 5]
|
---|
| 65 | println!( "slice {:?}", &ia[.. ia.len() - 2 ] ); // drop lower bound, [1, 2, 3]
|
---|
| 66 | println!( "slice {:?}", &ia[..] ); // drop both bound, [1, 2, 3, 4, 5]
|
---|
| 67 |
|
---|
| 68 | let slice: &[f64];
|
---|
| 69 | slice = &fa[0 ..= 1];
|
---|
| 70 | println!( "slice = {:?}", slice ); // [1.2, 42.2]
|
---|
| 71 | let mut fa2: [f64; 2] = <[f64; 2]>::try_from( slice ).unwrap(); // convert slice to array
|
---|
| 72 | println!( "fa2 {:?}", fa2 ); // [1.2, 42.2]
|
---|
| 73 | fa2 = (& fa[2 ..= 3]).try_into().unwrap(); // convert slice to array
|
---|
| 74 | println!( "fa2 {:?}", fa2 ); // [1.2, 42.2]
|
---|
| 75 |
|
---|
| 76 | // pass (all) slice by reference
|
---|
| 77 | fn zero( arr: & mut [usize] ){
|
---|
| 78 | for i in 0 .. arr.len() { arr[i] = 0; }
|
---|
| 79 | println!( "function update {:?}", arr );
|
---|
| 80 | }
|
---|
| 81 | zero( & mut ia[0..5] );
|
---|
| 82 | zero( & mut ia[0..3] );
|
---|
| 83 |
|
---|
| 84 | let mut vec: Vec< Vec<usize> > = Vec::new();
|
---|
| 85 | for r in 0 .. ROWS {
|
---|
| 86 | let mut row: Vec<usize> = Vec::new();
|
---|
| 87 | for c in 0 .. COLS {
|
---|
| 88 | row.push(r + c);
|
---|
| 89 | }
|
---|
| 90 | vec.push(row);
|
---|
| 91 | }
|
---|
| 92 | for r in 0 .. 4 {
|
---|
| 93 | for c in 0 .. 4 {
|
---|
| 94 | print!("{} ", vec[r][c]);
|
---|
| 95 | }
|
---|
| 96 | println!("");
|
---|
| 97 | }
|
---|
| 98 |
|
---|
| 99 | // 2 dimensional (matrix), variable-size (C++ vector) array of array, heap allocated
|
---|
| 100 | let (rows, cols) = (4, 6);
|
---|
| 101 | let mut matrix = vec![vec![0; cols]; rows];
|
---|
| 102 | for r in 0 .. rows {
|
---|
| 103 | for c in 0 .. cols {
|
---|
| 104 | matrix[r][c] = r + c;
|
---|
| 105 | print!("{} ", matrix[r][c]);
|
---|
| 106 | }
|
---|
| 107 | println!("");
|
---|
| 108 | }
|
---|
| 109 |
|
---|
| 110 | let mut slice3: &[usize] = &matrix[3][2 ..= 4];
|
---|
| 111 | println!( "{:?}", slice3 );
|
---|
| 112 | slice3 = &matrix[1 ..= 3][1];
|
---|
| 113 | println!( "{:?}", slice3 );
|
---|
| 114 |
|
---|
| 115 | fn f<const N: usize>( arg: [usize; N] ) {
|
---|
| 116 | for r in 0 .. arg.len() {
|
---|
| 117 | print!( "{} ", arg[r] );
|
---|
| 118 | }
|
---|
| 119 | println!("");
|
---|
| 120 | }
|
---|
| 121 | f( ia );
|
---|
| 122 | }
|
---|
| 123 |
|
---|
| 124 | // Local Variables: //
|
---|
| 125 | // tab-width: 4 //
|
---|
| 126 | // compile-command: "rustc arrays.rs" //
|
---|
| 127 | // End: //
|
---|